C语言二进制移位运算符

时间:2017-02-02 21:09:52

标签: c bit-manipulation

我正在尝试为项目学习一些基本的C语言。 关于二元移位运算符的维基百科文章:

  

如果变量ch包含位模式11100101,则ch>> 1将产生结果01110010,并且ch>> 2将产生00111001。

只是为了澄清,如果你将二进制运算符的最后一位移到右边(>> 1),它是否会丢失?它不会旋转到前面,就像在圆形阵列中一样,是否正确?

3 个答案:

答案 0 :(得分:2)

这就是C(C标准)关于向右移位的神圣话语:

6.5.7p5

  

E1>的结果> E2是E1右移E2位位置。如果E1有   无符号类型或E1具有带符号类型和非负值,   结果的值是E1 /的商的不可分割的一部分   2 E2 。如果E1具有带符号类型和负值,则生成   值是实现定义的。

换句话说:  x>>n == x/two_to_the(n),但如果x<0

可能不是这种情况

(更直接地回答,是的 - 当你分开时,最低有效位会丢失)。

答案 1 :(得分:1)

如果x >> 1无符号或为正数,则移位操作x将导致等于x的值除以2,如果x为负数,则为实现定义(C.2011§6.5.7¶5)。

答案 2 :(得分:1)

是的,除非你在移位之前保存它的值,否则最外面的位将会丢失:

unsigned char ch = 229; 
int lostBit = ch & 0x01;
ch >>= 1;

请注意,位移运算符>>仅针对无符号或正值定义。在您的示例中,如果ch是签名字符,则值11100101实际上表示负数(-27),操作将产生未定义的行为。