ビットNOTと1の補数
すべてのビットを反転するNOT(~)演算子を理解します。1の補数、2の補数、NOTとバイナリでの否定の関係を学びます。
NOT Operations
詳細な説明
ビットNOT(~)を理解する
NOTは単項演算子で、単一のオペランドのすべてのビットを反転します:0は1に、1は0になります。結果は元の値の1の補数と呼ばれます。
真理値表
A | ~A
--|----
0 | 1
1 | 0
計算例(8ビット)
42 = 00101010
~42 = 11010101 (符号なし213、符号付き-43)
1の補数 vs 2の補数
2の補数(現代のほぼすべてのCPUが使用)を使用する符号付き整数システムでは、NOTと否定の関係は:
~A = -(A + 1)
つまり~42 = -43、~0 = -1、~(-1) = 0です。この恒等式は以下に有用です:
- 加算なしで
-(A + 1)を計算 - ビットマスクの作成:
~0はすべて1を生成(32ビットでは0xFFFFFFFF) - マスクの反転:
~maskでビットクリア用の補数マスクを取得
実用的なパターン
AND + NOTでビットをクリア:
// valueのビット3をクリア
value = value & ~(1 << 3);
上位Nビットのマスクを作成:
// バイトの上位4ビットのマスク
const mask = ~0x0F & 0xFF; // 0xF0
ビット幅の影響
NOTの結果はビット幅に依存します。8ビットでの~42は213(符号なし)または-43(符号付き)ですが、32ビットでは4294967253(符号なし)または同じく-43(符号付き)です。NOTを使用する際は常に整数幅を意識してください。
ユースケース
システムプログラマーはNOTを使用してハードウェアレジスタのビットクリア用の補数マスクを作成します。例えば、マイクロコントローラで特定の割り込みを無効にするには、割り込み有効レジスタを読み取り、割り込みのビットマスクのNOTとANDし、書き戻します:REG = REG & ~INT_MASK。これにより他のすべての割り込み設定を保持しながらターゲットビットだけをクリアします。