[英]Bit shifting with leading 1
当我在 c++ 中的 1000 上使用 >> 位运算符时,它会给出以下结果:1100。我希望结果为 0100。当 1 在任何其他 position 中时,这正是发生的情况,但在前导 1 时会出错。 为什么会这样,如何避免?
您描述的行为与在某些平台上右移具有高位设置的签名 integer 时发生的行为一致(因此,负值)。
在这种情况下,在许多平台上,编译器会发出代码来执行算术移位,这会传播符号位; 这样,在负整数的 2 补码表示的平台上(= 几乎每个当前平台)即使在负值上也会产生“ x >> i
= floor(x/2 i )”行为的效果。 请注意,这不是合同规定的——就 C++ 标准而言,在实现定义的行为中移动负整数,因此任何编译器都可以自由地为其实现不同的语义1 。
要回答您的问题,要获得“常规”移位行为(通常称为“逻辑移位”),您必须确保使用unsigned
整数。 这可以通过确保您要移动的变量是无符号类型(例如unsigned int
)或者,如果它是一个文字,通过给它加上一个U
后缀来获得(例如1
是一个int
, 1U
是一个unsigned int
)。
如果您拥有的数据是有符号类型(例如int
),您可以在无风险转移之前将其转换为相应的unsigned
类型(从有符号 int 转换为无符号数据已由标准明确定义,并且不会改变2 的补码机器上的位值)。
正如其他人所提到的,当在有符号整数上右移时,它是实现定义的,你会得到 1 还是 0。 在您的情况下,因为 1000 中最左边的位是 1,所以“替换位”也是 1。假设您必须使用带符号的整数,为了摆脱它,您可以应用位掩码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.