前置1的位移位

问题描述 投票:0回答:2

[当我在C ++中对1000使用按位运算符时,它将给出以下结果:1100。我希望结果为0100。当1处于任何其他位置时,这正是发生的情况,但是在前导1时会发生错误。为什么会这样,如何避免呢?

c++ bit bit-shift
2个回答
1
投票

您描述的行为与some平台上发生的变化(当右移设置了高位的带符号整数(因此为负值)时。)>

[在这种情况下,在许多平台上,编译器将发出代码以执行arithmetic shift,该代码传播符号位;在带有2的负整数补码表示的平台上(实际上几乎每个当前平台),即使在负值上也具有“x >> i= floor(x / 2 i

)”行为。请注意,这不是契约性的,就C ++标准而言,它以未定义的行为1移负整数。

要提出您的问题,要获得“常规”移位行为(通常称为“逻辑移位”),必须确保对unsigned整数进行运算。可以通过确保您要移动的变量为无符号类型(例如unsigned int)来获得,也可以通过在其后加上U后缀(例如1int)来获得该变量。 1Uunsigned int)。

如果您拥有的数据属于带符号类型(例如int),则可以在转换之前无风险地将其转换为相应的unsigned类型(标准明确定义了从带符号的int到无符号的转换) ,并且不会更改2的补码机上的位值)。


  1. 历史上,这源于C甚至在硬件级别上甚至不支持没有“便宜的”算术移位功能和/或不使用2的补码表示法的机器。
  2. 正如其他人所提到的,当在带符号的int上右移时,实现将定义为1还是0。在您的情况下,因为1000的最左边的位是1,所以“替换位”也为1。假设您必须使用带符号的int,为了摆脱它,可以应用位掩码。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.