按位运算,x*x<0怎么办?
Bitwise arithmetic, How can x*x<0?
我正在复习涉及按位运算的考试,发现了一个有用的页面,其中有一个我感到困惑的问题。
http://www.cs.cmu.edu/afs/cs/academic/class/15213-f05/lectures/class03.txt
具体问题在页面底部'Puzzles'下。给定一个有符号整数 x,并假设一个 32 位字长和 2 的补码,我们如何证明
x*x <0?
他们将 50000 列为可能的解决方案,但我不确定为什么或如何工作。
考虑到 3*3 = 9、0011 * 0011 = 1001,我尝试从小开始。
移动到 2 个半字节,0010 0001 * 0010 0010 = 34*34 = 1156 = 100 [1000 0100]
并且认为我发现了一种增加 1 位之间间隔的模式,但是当我接近 32 位时它不起作用。
谁能指出我正确的方向?
在2的补码中,最高位表示数字的符号。如果您对正数进行算术运算,最终将带入该特定位,则最终将得到一个负数。
例如:
50 000 = 0b00000000000000001100001101010000
50 000 * 50 000 = 0b10010101000000101111100100000000
最高有效位设置为 1,因此当解释为 有符号值.
时,结果数字被视为负数
下面是上述想法的快速演示:https://ideone.com/TU049L
我正在复习涉及按位运算的考试,发现了一个有用的页面,其中有一个我感到困惑的问题。 http://www.cs.cmu.edu/afs/cs/academic/class/15213-f05/lectures/class03.txt
具体问题在页面底部'Puzzles'下。给定一个有符号整数 x,并假设一个 32 位字长和 2 的补码,我们如何证明
x*x <0?
他们将 50000 列为可能的解决方案,但我不确定为什么或如何工作。
考虑到 3*3 = 9、0011 * 0011 = 1001,我尝试从小开始。 移动到 2 个半字节,0010 0001 * 0010 0010 = 34*34 = 1156 = 100 [1000 0100] 并且认为我发现了一种增加 1 位之间间隔的模式,但是当我接近 32 位时它不起作用。
谁能指出我正确的方向?
在2的补码中,最高位表示数字的符号。如果您对正数进行算术运算,最终将带入该特定位,则最终将得到一个负数。
例如:
50 000 = 0b00000000000000001100001101010000
50 000 * 50 000 = 0b10010101000000101111100100000000
最高有效位设置为 1,因此当解释为 有符号值.
时,结果数字被视为负数下面是上述想法的快速演示:https://ideone.com/TU049L