JavaRush /Java Blog /Random-JA /ビット単位の否定 - なぜそうなるのでしょうか?
Alex Bolgov
レベル 37
Ташкент

ビット単位の否定 - なぜそうなるのでしょうか?

Random-JA グループに公開済み
皆さん、こんにちは:)ビット演算の 記事を読んでいるときに、他の人たちと同じように、私も疑問を抱きました。数値 342 を反転すると、なぜ -343 になるのでしょう。記事内では次のようになります。 ビット単位の否定 - なぜそうなるのか - 1特に好奇心旺盛な人 (私のような) は次のような質問をします。「ねえ、でも 010101001 は 101010110 より小さいです。論理的には 342 より小さく、正であるべきです。」オンライン数値コンバーターに入力するか、コードを使用して確認します。
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
予想外に、-343 以外の結果が得られます...
169
ああ、なんといいことだろう、昔、C 言語でのプログラミングの授業で、どういうわけか整数の符号桁について簡単に聞いたことがある。しばらくグーグルで調べてみると、これが何の動物なのか説明できるようになりました。ビット単位の否定 - なぜそうなるのか - 2実はこの記事には不正確なところがあり、混乱を招いています。コードを使用して、数値 342 を反転した結果が実際にどうなるかを確認すると、次のようになります。
int a = 342;
System.out.println(Integer.toBinaryString(~a));
そうすれば、少し異なる結果が表示されます
11111111111111111111111010101001
なぜそうなるのでしょうか? 問題は、変数に単純に 101010110 を含めることはできず、実際には次のように格納されるということです。
000000000000000000000000101010110
結局のところ、int 変数は 4 バイト必要です。32ビット - 32個のメモリセル。反転後は、絶対にすべての数値が変化します。先頭のゼロを「トリミング」しました。ここからが楽しい部分です。バイナリ表現では数値の前の + または - 符号を格納できないため、トリックが 1 つあります。それは、最初のビットが実際に符号を担当し、正確に符号ビットであるということです。そして、すべての数値はこのロジックに従って保存されます。00...000 から 01...111 までの数値は、0 から始まり (つまり、0 から 2147483647 まで)、10...000 から 11... 111 までは正です。負の値で、最小のものから始まり -1 で終わります (つまり、-2147483648 から -1)。
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
そしてあなたは尋ねます、「わかった、ナワリヌイ、私たちはあなたの言うことを信じますが、なぜここが彼の宮殿だと決めたのですか?」しかし、これだけで-343になるのはなぜですか?とてもシンプルです。これは手動で簡単に計算できます。結果として得られる数値 342 ( 11111111111111111111111111111111111111010101001 )のバイナリ バージョンから最初のビットを「切り取り」(または 0 に置き換え) 、それを 10 進数形式に戻します。
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
それならわかります
01111111111111111111111010101001 = 2147483305
実際、ここでは最初の 1 を単に「切り取った」のではなく、この数値から 1000000000000000000000000000000000 を引きました。次に、それを 10 進数形式で足し直します。これから見ること:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
必要な数字は -343 です :) みなさん、これはここでの最初の投稿です。気に入っていただけて有益でしたら、いいねしてください (本当にすべての実績を収集したいと思っています😄) このトピックについて詳しくは、こちらをご覧ください: 皆さんの幸運を祈ります、そしてご清聴ありがとうございました)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION