アセンブリで関数を記述しようとしています (ただし、質問には言語に依存しないと仮定します)。
ビット単位の演算子を使用して、渡された数値のすべてのビットを 1 に設定するにはどうすればよいですか?
設定したいビットを含むマスクでビット単位の「または」を使用できることはわかっていますが、N サイズの 2 進数に基づいてマスクを作成する方法がわかりません。
アセンブリで関数を記述しようとしています (ただし、質問には言語に依存しないと仮定します)。
ビット単位の演算子を使用して、渡された数値のすべてのビットを 1 に設定するにはどうすればよいですか?
設定したいビットを含むマスクでビット単位の「または」を使用できることはわかっていますが、N サイズの 2 進数に基づいてマスクを作成する方法がわかりません。
~(x & 0)
x & 0 は常に 0 になり、~ はすべてのビットを 1 に反転します。
0 に設定してから、ビットごとの NOT ですべてのビットを 1 に反転します。
アセンブリ言語では、「渡された数値」のサイズを知る必要があることに気付くでしょう。そして、アセンブリ言語では、アセンブリ言語がどのマシン用であるかが本当に重要です。
その情報を考えると、あなたはどちらかを尋ねるかもしれません
また
レジスタをすべて 1 のビットで埋めるには、ほとんどのマシンで効率的な方法として 2 つの命令が必要です。
専用のクリア命令を使用してレジスタをクリアするか、即値 0 をロードするか、レジスタをそれ自体で xor します。
レジスタのビットごとの補数を取ります。
メモリを 1 ビットで埋めるには、1 つ以上のストア命令が必要です...
Hank Warren のすばらしい本Hacker's Delightには、さらに多くのちょっとしたヒントやコツが書かれています。
x を 1 に設定
x < 数 x = x * 2 の間
答え = 数または x - 1。
コードは、入力が「数値」と呼ばれることを前提としています。正の値に対しては正常に機能するはずです。2 の補数である負の値の場合、上位ビットは常に 1 であるため、操作の試行は意味をなさないことに注意してください。
に設定し-1
ます。これは通常、すべてのビットが 1 であることで表されます。