サイズが不明な2進数ですべてのビットを「1」に設定するにはどうすればよいですか?
-
03-07-2019 - |
質問
アセンブリで関数を記述しようとしています(ただし、言語は問いません。)
ビット単位の演算子を使用して、渡された数値のすべてのビットを1に設定するにはどうすればよいですか?
ビット単位の<!> quot;または<!> quot;を使用できることを知っています。設定したいビットのマスクを使用しますが、Nサイズの2進数に基づいてマスクを作成する方法がわかりません。
解決
〜(x <!> amp; 0)
x <!> amp; 0は常に0になり、〜はすべてのビットを1に反転します。
他のヒント
0に設定し、ビット単位のNOTですべてのビットを1に反転します。
アセンブリ言語では、<!> quot;渡された数字<!> quot;のサイズを持っていることがわかります。アセンブリ言語では、アセンブリ言語がどのマシンにどのマシン用であるかが本当に重要です。
その情報があれば、あなたはどちらかを尋ねているかもしれません
- 整数レジスタをすべて1ビットに設定するにはどうすればよいですか
または
- メモリ内の領域をすべて1ビットで埋めるにはどうすればよいですか
レジスタをすべて1ビットで埋めるために、ほとんどのマシンで効率的な方法は2つの命令を取ります:
-
専用のクリア命令を使用してレジスタをクリアするか、即時0をロードするか、またはレジスタ自体をxorします。
-
レジスタのビット単位の補数を取得します。
メモリに1ビットを充填するには、1つ以上のストア命令が必要です...
ハンク・ウォーレンのすばらしい本ハッカーの喜びには、さらに多くのちょっとした工夫とコツがあります。
xを1に設定
x <!> lt;数 x = x * 2
Answer = numberまたはx-1。
コードは、入力が<!> quot; number <!> quot;と呼ばれることを前提としています。正の値の場合は正常に機能するはずです。高い値のビットは常に1であるため、2の補数である負の値の場合、操作の試行は意味をなしません。
-1
に設定します。これは通常、すべてのビットが1で表されます。
T(~T(0))
を使用します。
T
はタイプ名です(C ++の場合)。
これは、タイプがint
より小さい場合に、<=>への不要な昇格を防ぎます。