繁体   English   中英

带前导 1 的位移

[英]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是一个int1U是一个unsigned int )。

如果您拥有的数据是有符号类型(例如int ),您可以在无风险转移之前将其转换为相应的unsigned类型(从有符号 int 转换为无符号数据已由标准明确定义,并且不会改变2 的补码机器上的位值)。


  1. 从历史上看,这是因为 C 努力支持甚至在硬件级别没有“廉价”算术移位功能和/或不使用 2 的补码表示的机器。

正如其他人所提到的,当在有符号整数上右移时,它是实现定义的,你会得到 1 还是 0。 在您的情况下,因为 1000 中最左边的位是 1,所以“替换位”也是 1。假设您必须使用带符号的整数,为了摆脱它,您可以应用位掩码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM