JavaRush /Java 博客 /Random-ZH /按位取反——为什么会这样?
Alex Bolgov
第 37 级
Ташкент

按位取反——为什么会这样?

已在 Random-ZH 群组中发布
大家好:) 在阅读《按位运算》一文时我和其他一些人一样有一个问题:为什么当我们将数字 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 呢?这真的很简单。我们可以简单地手动计算。如果我们“截断”(或用 0 替换)结果数字 342 的二进制版本的第一位 ( 1111111111111111111111111111111111111111010101001 )并将其返回到十进制形式。
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
然后我们就得到了
01111111111111111111111010101001 = 2147483305
事实上,这里我们并不是一开始就“截掉”了1,而是从这个数字中减去了1000000000000000000000000000000000。现在我们把它加回来,但是是十进制的形式。我们将看到什么:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
这是所需的数字 -343 :) 伙计们,这是我在这里的第一篇文章,如果您喜欢它并且内容丰富,请喜欢它(我真的很想收集所有成就😄)您可以在这里阅读有关此主题的更多信息: 祝大家好运,感谢您的关注)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION