简单来说,~n给出的定义是-n-1。
例如~1
1 = 0001
~1 = 1110 (which is -2)
偶数
说~2
2 = 0010
~2 = 1101 (which is the representation of -3 in twos complement)
但问题是
1110 = -2 can be easily visualized as -2 (the right two bits are 10 and the rest all 1)
1101 = -3 can't be visualized like this (going by the above logic it should be -5)
所以我想知道是否有一种简单的方法可以从二进制补码二进制中看出并判断负数表示什么,而无需进行太多计算。
答案 0 :(得分:3)
~n = -n - 1
相当于-n = ~n + 1
。这意味着要弄清楚数字的负数是什么,你可以将它反转(在你的头脑中)并添加一个。假装零是1,反之亦然,然后添加一个。
示例:假装此
1101
是这个
0010
然后加1
0011
因此,1101
代表-3
。
答案 1 :(得分:0)
定义是因为2的整数补码表示。所以“真的”~n
是n
,所有位都被翻转。但是,翻转“全部”位的结果在某种意义上取决于n
的位数。 CPython在内部使用固定宽度的整数,但语言不会将它们呈现给程序员,因此唯一有意义的概括定义是算术~n = -n - 1
。但是这个定义的动机是翻转固定宽度2的补码整数。
1110 = ~2可以很容易地显示为-2
...1110
不是~2
,而是-2
。 ~2
为...1101
,因为2
为...010
。
1101 = ~3无法像这样显示
...1101
不是~3
,而是-3
。 ~3
为...1100
,因为3
为...011
。
我想象这一点的方式(当我想象它时 - 作为训练的数学家,我宁愿不考虑具体数字),就是要知道在2的补语中,...10...
总是被否定的力量二。因此...10
为-2,...100
为-4,等等。
然后,为了知道例如...110110
是什么,它是...110000
+ 110
,也就是说-16
+ 6
,这是{ {1}}。
当然-10
也是(按位翻转)...110110
,也就是说~1001
,其公式为~9
,也是{{1} }}。所以系统工作; - )