意外的C#位右移结果
我低估了意外的C#位右移结果,c#,bit-shift,C#,Bit Shift,我低估了>操作符的复杂性;这不是我想的那样 我想右移6542454的uint值。我以为是这样的: val(is)==110001111101010001110110 val>>1==1100011111010100001110111 val>>2==11000111110101000011101 val>>3==110001111101010001110 val>>4==11000111110101000111 val>>5==1100011111010100011 val>>6==110001
>
操作符的复杂性;这不是我想的那样
我想右移6542454的uint
值。我以为是这样的:
val(is)==110001111101010001110110
val>>1==1100011111010100001110111
val>>2==11000111110101000011101
val>>3==110001111101010001110
val>>4==11000111110101000111
val>>5==1100011111010100011
val>>6==110001111101010001
val>>7==11000111101000
事实上,结果是:
val>>1==1100011111010100001110111
val>>2==11000111110101000011101
val>>3==111111001100110010011
val>>4==11111100110011001001
val>>5==11111001001100100
val>>6==11111 001100100110010
val>>7==10011011111110111100
第三次手术很明显做了一些我不理解的事情,从那以后事情就偏离了轨道。似乎在第七次手术中又做了我不明白的事情
连续7次使用>=
运算符可以生成我期望的值:
val>>=1==110001111101010001110111
val>>=1==11000111110101000011101
val>>=1==110001111101010001110
val>>=1==11000111110101000111
val>>=1==1100011111010100011
val>>=1==110001111101010001
val>>=1==11000111101000
为什么val>>3
产生的结果与对val>>=1的3次调用的结果不同
更新:
这是我的错。当从VisualStudio复制并粘贴十进制值时,我没有注意到截断的发生
被移位的实际值是654245426,正如每个人都正确指出的那样,C对该值进行了完美的位移位。我编写了代码来输出每个移位:
uint i = 6542454;
for (int j = 0; j < 8; j++)
{
uint k = i >> j;
Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}
你能提供一个简单的示例程序来复制这个问题吗?您描述的行为违反了C#规范,因此值得检查您是否有其他问题,例如计算移位的代码中的运算符优先级问题。您能否显示用于打印值的代码?您>>3在Dec(8178067)中显示几乎正确的结果,而不是817806。所以我猜你的打印代码是关闭的…是的,我只是做了同样的,我也得到了预期的结果。
6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000