位运算符在正数和负数(Bitwise Operator on positive and negati

2019-08-04 01:52发布

    -5 / 2 = -2

    -5 >> 1 = -3

我从我的老师认为>> 1由2分数它适用于正数,但它不负数工作学习。 谁能给我解释一下?

谢谢

Answer 1:

作为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 = 32765

或者至少,我是这样理解



Answer 2:

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

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


[expr.shift] / 3告诉此:

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



Answer 3:

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

  1. 改变以1比0和0比1,那么我们得到1111 1111 1111 1010
  2. 然后取这个数字+ 1,我们得到1111 1111 1111 1011

现在,我们得到:-5 = 1111 1111 1111 1011(它在2的补码形式)
因此,这里是如何计算-5 >> 1:

  1. 移动-5每一位由左到右(>>),我们(左只有15位)获得111 1111 1111 1101
  2. 因为-5是负数,所以我们必须填写“1”到第一位,使之成为16位,然后我们得到1111 1111 1111 1101(它仍然在2的补码形式)
  3. 现在,它通过改变0转换为正常二进制形式为1,1到0(除第一比特,因为它定义在2的补负数),则加“1”。 这样我们就得到1000 0000 0000 0011 = -3


Answer 4:

我从我的老师认为>> 1除以2号学习。

它不除以二的整数,但它执行(取决于值) 逻辑或算术移位一个位到右侧。 它发生两个在某些情况下等于一个部门。

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

它的工作原理在这两种情况下,但具体行为不是由标准的规定,而是实现定义。 它通常由两部分并截断结果向负无穷,在constrast朝着零作为一个正常的分工会做。

以供参考:

  • http://en.cppreference.com/w/cpp/language/operator_arithmetic


Answer 5:

我认为答案是正确的。 如“/”(除法)运算产生商数(除法的结果)。

在你的问题:

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

因此,这是确定有正反两方面的数字。

正数:

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

因此,它是罚款与正数。

注意

其余永远是负数。 它始终是正数。



Answer 6:

我想答案>> -5 1 = -3。 在正数的情况下,说5,通过2分割给出2.5四舍五入为最接近的最小整数即2

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



Answer 7:

在c向右移位运算保留符号bit.hence移位比特与保留符号位右侧再次产生一个负数,这是两个互补形式。



文章来源: Bitwise Operator on positive and negative numbers