1の補数
読み:いちのほすう
外語:one's complement
2進数
における
負の数
の表わし方の一つで、すべての
ビット
を反転させたもののこと。つまり、正数表現に対し、単純に
論理否定
を取ったものである。
目次
概要
特徴
マイナス1
マイナス0
1の補数和
概要
ネットワークチェックサムと呼ばれる、
IP
、
TCP
、
UDP
を始めとする各種プロトコルのチェックサム計算用に使われている。
IP、TCP、UDPは「1の補数和の1の補数」が使われている。
ここで
2の補数
でなく1の補数なのは、バイトオーダーを気にせず計算できる利点があるためで、後者で最後に結果を否定して1の補数にしているのは、パケット全体を1の補数和した時に結果が0になり計算しやすいからである。
特徴
マイナス1
例えば-1を例にする。16進数4桁で+1は0x0001なので、これを
論理否定
すると0xFFFEとなる。
つまり1の補数の世界では0xFFFEが-1を意味することになる。
マイナス0
1の補数の世界では、+0の否定として-0が存在する点も重要である。
16進数4桁で0は0x0000なので、これを否定すると0xFFFFとなる。+0も-0も同じ値と考えれば、0の表現に0x0000と0xFFFFの二つが存在するということになる。
計算する場合の盲点となりがちなので注意が必要である。
1の補数和
1の補数の加算は
1の補数和
と呼ばれ、左の桁への桁上がりを一番右に足し込むことで行なう。
一例として0xFFFFと0x1234の和(1の補数和)を考える。0xFFFF+0x1234→0x11233となるが、16
ビット
を超えた部分を右側に加算するので、結果は0x1234となり、元と値は変わらない。なぜなら1の補数の世界では0xFFFFは0を意味するからである。
1の補数の世界では-2(0xFFFD)、-1(0xFFFE)、-0(0xFFFF)、+0(0x0000)、+1(0x0001)、+2(0x0002)…のようになるため、0xFFFFに1足して桁上がりした場合、0x0000(つまり+0)を経由する必要はなく、0x0001になるべきである。そのために、桁上がりの桁を右側に足し込むことになる。
再検索