错误的位移结果

Cor*_*ius 2 c# bit-shift

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

我正在宣布转移金额如下:

byte p_size = 0;
if (ver == 0x12 || ver == 0x13)
    p_size = 20;
else
    p_size = 40;
Run Code Online (Sandbox Code Playgroud)

要移位的值声明为

int t_size = rinput.ReadInt32();
Run Code Online (Sandbox Code Playgroud)

最后我用来转移的代码:

int temp = t_size >> p_size << p_size;
Run Code Online (Sandbox Code Playgroud)

假设t_size = 0x2000385E和p_size = 20. temp = 0x20000000.

现在,如果t_size = 0x40001014和p_size = 40,则temp = 0x40001000而不是0x40000000.我使用按位计算器"手动"计算它,它匹配0x40000000的预期结果.

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

shf*_*301 7

将32位整数移位40位并没有多大意义,因为你要将整数移位的位数多于它所包含的位数.

无论是移位运算符的文件他们在这种情况下,这样做:

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

所以当p_size40 岁时,转变正在转移40 & 0x1f = 8 bits.

如果你需要换40位,但你的价值变成了 long.


Ale*_*kov 5

操作符>>中所述,当前行为为40&0x1f为8

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

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

  t_size & 0xFF000000
Run Code Online (Sandbox Code Playgroud)