我正在尝试为项目学习一些基本的C语言。 关于二元移位运算符的维基百科文章:
如果变量ch包含位模式11100101,则ch>> 1将产生结果01110010,并且ch>> 2将产生00111001。
只是为了澄清,如果你将二进制运算符的最后一位移到右边(>> 1),它是否会丢失?它不会旋转到前面,就像在圆形阵列中一样,是否正确?
答案 0 :(得分:2)
这就是C(C标准)关于向右移位的神圣话语:
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),操作将产生未定义的行为。