错误的位移结果

时间:2015-10-19 20:14:12

标签: c# bit-shift

我第一次使用bitshift,我遇到了意想不到的结果。

我宣布转移金额如下:

byte p_size = 0;
if (ver == 0x12 || ver == 0x13)
    p_size = 20;
else
    p_size = 40;

要移位的值声明为

int t_size = rinput.ReadInt32();

最后我用来转移的代码:

int temp = t_size >> p_size << p_size;

让我们按照预期说t_size = 0x2000385E和p_size = 20. temp = 0x20000000。

现在,如果t_size = 0x40001014且p_size = 40,则temp = 0x40001000而不是0x40000000。我计算了#34;手动&#34;使用按位计算器,它匹配0x40000000的预期结果。

这可能是对我的愚蠢疏忽,但我不明白什么会导致p_size = 40的奇怪结果......任何建议都值得赞赏!

2 个答案:

答案 0 :(得分:7)

将32位整数移位40位并不是很有意义,因为你要将整数移位的位数多于它所包含的位数。

leftright移位运算符都记录了他们在这种情况下的作用:

  

如果第一个操作数是int或uint(32位数量),则移位   count由第二个操作数的低位五位给出   (第二个操作数&amp; 0x1f)。

因此,当p_size为40时,班次正在移动40 & 0x1f = 8 bits.

如果您需要将40位移位,但将值移至long

答案 1 :(得分:5)

目前的行为预计为40&amp;如operator >>

中所述,0x1f为8
  

如果第一个操作数是int或uint(32位数),则移位计数由第二个操作数的低位5位(第二个操作数和0x1f)给出。

你可能正在寻找一些掩盖而不是转变 - 也许

  t_size & 0xFF000000