ビット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。これにより他のすべての割り込み設定を保持しながらターゲットビットだけをクリアします。

試してみる — Bitwise Calculator

フルツールを開く