23

アセンブリで関数を記述しようとしています (ただし、質問には言語に依存しないと仮定します)。

ビット単位の演算子を使用して、渡された数値のすべてのビットを 1 に設定するにはどうすればよいですか?

設定したいビットを含むマスクでビット単位の「または」を使用できることはわかっていますが、N サイズの 2 進数に基づいてマスクを作成する方法がわかりません。

4

6 に答える 6

67

~(x & 0)

x & 0 は常に 0 になり、~ はすべてのビットを 1 に反転します。

于 2009-05-04T01:49:01.947 に答える
7

0 に設定してから、ビットごとの NOT ですべてのビットを 1 に反転します。

于 2009-05-04T01:51:50.600 に答える
6

アセンブリ言語では、「渡された数値」のサイズを知る必要あることに気付くでしょう。そして、アセンブリ言語では、アセンブリ言語がどのマシン用であるかが本当に重要です。

その情報を考えると、あなたはどちらかを尋ねるかもしれません

  • 整数レジスタをすべて 1 ビットに設定するにはどうすればよいですか?

また

  • メモリ内の領域をすべて 1 のビットで埋めるにはどうすればよいですか?

レジスタをすべて 1 のビットで埋めるには、ほとんどのマシンで効率的な方法として 2 つの命令が必要です。

  1. 専用のクリア命令を使用してレジスタをクリアするか、即値 0 をロードするか、レジスタをそれ自体で xor します。

  2. レジスタのビットごとの補数を取ります。

メモリを 1 ビットで埋めるには、1 つ以上のストア命令が必要です...

Hank Warren のすばらしい本Hacker's Delightには、さらに多くのちょっとしたヒントやコツが書かれています。

于 2009-05-04T02:25:57.770 に答える
2

x を 1 に設定

x < 数 x = x * 2 の間

答え = 数または x - 1。

コードは、入力が「数値」と呼ばれることを前提としています。正の値に対しては正常に機能するはずです。2 の補数である負の値の場合、上位ビットは常に 1 であるため、操作の試行は意味をなさないことに注意してください。

于 2009-05-04T02:11:36.620 に答える
2

に設定し-1ます。これは通常、すべてのビットが 1 であることで表されます。

于 2009-05-04T01:49:45.503 に答える