正数和负数的按位运算符

时间:2012-12-13 11:14:15

标签: c++ bitwise-operators

    -5 / 2 = -2

    -5 >> 1 = -3

我向老师学习>> 1将数字除以2.它适用于正数,但不适用于负数。有人可以向我解释一下吗?

由于

7 个答案:

答案 0 :(得分:6)

作为BЈовић&神秘状态,在负数上使用位移算子是实现定义的 其原因是C不区分逻辑和算术位移 (具有最高位的算术焊盘,具有0的逻辑焊盘)
对于正数,这无关紧要,因为算术和逻辑位移都会将最高位保持为0:
算术5>> 1
0000 0000 0000 0101 = 5

0000 0000 0000 0010 = 2

逻辑5>> 1
0000 0000 0000 0101 = 5

0000 0000 0000 0010 = 2

然而带负数(2的comp)
算术-5>> 1
1111 1111 1111 1011 = -5

1111 1111 1111 1101 = -3

逻辑-5>> 1
1111 1111 1111 1011 = -5

0111 1111 1111 1101 = 32,765

或者至少,这是我理解的方式

答案 1 :(得分:5)

  

它适用于正数,但不适用于负数。

对负整数使用移位运算符是实现定义的。


[expr.shift] / 3告诉我:

  

E1的值>> E2是E1右移E2位位置。如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1 / 2E2的商的整数部分。如果E1具有有符号类型和负值,则结果值是实现定义的。

答案 2 :(得分:1)

  

我向老师学习>> 1将数字除以2.

它不会将整数除以2,但它会执行(取决于值)  右边一位logicalarithmetic shift。在某些情况下,它恰好等于两分。

  

它适用于正数,但不适用于负数。

在两种情况下都可以正常工作,但确切的行为不是标准规定的,而是实现定义的。它通常除以2并将结果截断为负无穷大,与正常除法相反,向零逼近。

供参考:

答案 3 :(得分:1)

首先,
二进制5是0000 0000 0000 0101 但-5怎么样?这是:

  1. 将1改为0且0改为1,然后我们得到1111 1111 1111 1010
  2. 然后取这个数字+ 1,我们得到1111 1111 1111 1011
  3. 现在我们得到:-5 = 1111 1111 1111 1011(以2的补码形式)
    所以这是如何计算-5>> 1:

    1. 将-5的每一位从左向右移动(>>)我们得到 111 1111 1111 1101(仅剩15位)
    2. 因为-5是负数,所以我们必须将'1'填充到第一位以使其变为16位 然后我们得到1111 1111 1111 1101(它仍然是2的补码形式)
    3. 现在将其转换为正常的二进制形式,方法是将0改为1,将1转换为0(第一位除外,因为它定义了2的补码中的负数),然后再加上'1'。 所以我们得到1000 0000 0000 0011 = -3

答案 4 :(得分:0)

我认为答案是正确的。由于'/'(除法)运算符生成商(除法结果)。

在您的问题中:

-5/2 = -3(quotient) and 1(remainder ). 

所以正数和负数都可以。

正数:

5/2 = 2(quotient) and 1(remainder ). 

所以没有正数。但

永远不会是负数。它总是正数。

答案 5 :(得分:0)

我猜答案是-5>> 1 = -3。 在正数(例如5)的情况下,除以2得到2.5舍入到最接近的最小整数,即2

但是当我们考虑负数-5时,除以2给出-2.5。它四舍五入到最接近的整数给出-3。

答案 6 :(得分:0)

在右移位运算符中保留符号位。然后右移位保留符号位再次产生一个负数,这是两个补码形式。