【编程之美】2.1求二进制中1的个数
题目: 对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。 题目解析: 这道题同样在【剑指offer】面试题10:二进制中1的个数中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这
题目:
对于一个字节的无符号整数变量,求其中的二进制表示中1的个数,要求算法执行效率尽可能高效。
题目解析:
这道题同样在【剑指offer】面试题10:二进制中1的个数 中出现,不过在剑指offer中没有提到无符号数,因此比该题目中多考虑一个层次。下面总结这道题的几种解法。
解法一(用于该题目):
我们通常会想到除以2就是将二进制右移一位,但要判断移除的是0还是1,就要对2取余。思路很简单,通过四则运算来解答:
int Count(Byte v) { int num = 0; while(v){ if(v%2) num++; v /= 2; } return num; }
解法二(用于该题目):
对于除以2来表示二进制右移,除法的效率比直接移位的效率低得多。碰到这样的题目,尽量用移位来代替。位运算就五种形式:与、或、异或、左移和右移。在这些范围里面找到自己想要的运算。移位时要判断移除的是0还是1,那么这里就应该通过与操作判断最后一位是否为1。
int Count2(Byte v) { int num = 0; while(v){ if(v & 1) num++; //也可以用 num += v&1; 来代替上面两行 v = v >> 1; } return num; }
解法三(可以用于有符号数):
如果这个题目是有符号的话,当右移的时候,会在高位补充符号位,用上面两种方法的话,会陷入死循环。如何避免?可以先判断最高位,然后遍历n-1次判断除了最高位以外的位是否为1。这样的方法比较麻烦。我们可以变通一个思路,让与的那一位1不断的左移,直到将1移到最高位。
int Count3(Byte v) { int num = 0; int flag = 1; while(flag){ if(v & flag) ++num; flag = flag <br> 解法四(更加高效的算法): <p><span><span>这种方法,充分利用了二进制的相关操作,平时应该多收集这样的运算。</span></span></p> <p><span><span>一个数不为0,那么二进制中肯定含1。当让这个数减去1时,最低位的1由1->0,更低位的0由0->1。当让n与n-1相与以后,n中最低位的1变成0。一次这样的操作,消去一个1,那么二进制中有多少个1,就循环多少次即可。</span><br> </span></p> <p></p><pre class="brush:php;toolbar:false">int Count4(Byte v) { int num = 0; while(v){ ++num; v = v & (v-1); } return num; }
解法五(空间换时间方法):
其实方法四已经够好了,但是因为只涉及到八位,我们可以利用选择直接选取相应的数据。比如0x1-0x2-0x4...这些都包含1个1;0x3-0x6...包含两个1;等等。通过switch语句选择相应的结果。但是这种方法效率可能比较低,因为,当输入v为255的时候,得比较到最后才能找到相应的数据。
int Count5(Byte v) { int num = 0; switch(v){ case 0x0: num = 0; break; case 0x1: case 0x2: .... } return num; }
解法六(哈希表法):
既然想到了利用空间换时间,我们干脆用个数组来表示,index为要查找的数,counttable[index]为该数据包含1的个数。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











正規表現を使用して PHP 配列から重複値を削除する方法: 正規表現 /(.*)(.+)/i を使用して、重複値を照合して置換します。配列要素を反復処理し、preg_match を使用して一致をチェックします。一致する場合は値をスキップし、一致しない場合は重複値のない新しい配列に追加します。

1. プログラミングは、Web サイト、モバイル アプリケーション、ゲーム、データ分析ツールなど、さまざまなソフトウェアやアプリケーションの開発に使用できます。その応用分野は非常に幅広く、科学研究、医療、金融、教育、エンターテイメントなど、ほぼすべての業界をカバーしています。 2. プログラミングを学ぶことは、問題解決スキルと論理的思考スキルを向上させるのに役立ちます。プログラミング中、問題を分析して理解し、解決策を見つけてコードに変換する必要があります。この考え方は、分析能力と抽象能力を養い、実際的な問題を解決する能力を向上させることができます。

5月8日の当サイトのニュースによると、TikTokは火曜日に米国連邦裁判所に訴訟を起こし、バイデン政権のダイベストメント法案に異議を唱え、法案の施行を阻止するよう米国の裁判所に求めた。 TikTokは火曜日に訴訟を起こし、議会が「TikTokを明確に選別して禁止するという前例のない措置を講じた」と主張し、この動きは「違憲」であると主張した。報道によると、ベックマン氏は、分離法案が正式に発効すれば、TikTokは法廷で反撃すると述べた。ベックマン氏は、「販売禁止法」はTikTokの米国ユーザー1億7000万人の憲法修正第1条の権利を「明らかに侵害」しており、プラットフォーム上の700万の中小企業に「壊滅的な結果」をもたらすだろうと述べた。また、「これは長いプロセスの始まりであり、終わりではない」とし、「戦い続ける」とも述べた。関連している

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

ブロックチェーンの速度に関して最も直感的な比較は、1 秒あたりのトランザクション数です。イーサリアムは現在最もよく知られているブロックチェーンの 1 つであり、そのトランザクション量も非常に大きく、開発者はスマート コントラクトと分散型アプリケーション (DApps) を構築および展開できます。安全かつ透明で改ざん防止のコンピューティング環境を提供します。少し前に、SOL チェーンが最速であるというデータが発表されましたが、イーサリアムの 1 ブロックにはいくつのトランザクションがあるのでしょうか?最新のデータによると、投資家の好奇心をそそります。イーサリアムの 1 ブロックでは 1 秒あたり約 23 件のトランザクションが行われています。以下の編集者が詳しく説明します。 1 つのイーサリアム ブロックにはいくつのトランザクションがありますか?最新のデータによると、イーサリアム ブロックには 1 秒あたり約 23 のトランザクションがありますが、イーサリアム ブロックには

C は初心者がプログラミングを学ぶのに理想的な言語であり、効率性、汎用性、移植性などの利点があります。 C 言語の学習には次のことが必要です。 C コンパイラ (MinGW や Cygwin など) をインストールする 変数、データ型、条件文、ループ文を理解する main 関数と printf() 関数を含む最初のプログラムを作成する 実際のケースによる練習 (平均値の計算など) C言語の知識

C++ プログラミング パズルは、フィボナッチ数列、階乗、ハミング距離、配列の最大値と最小値などのアルゴリズムとデータ構造の概念をカバーします。これらのパズルを解くことで、C++ の知識を強化し、アルゴリズムの理解とプログラミング スキルを向上させることができます。

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。
