我第一次使用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的奇怪结果......任何建议都值得赞赏!
答案 0 :(得分:7)
将32位整数移位40位并不是很有意义,因为你要将整数移位的位数多于它所包含的位数。
left和right移位运算符都记录了他们在这种情况下的作用:
如果第一个操作数是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