【问题标题】:Unexpected C# bit shift right result意外的 C# 位移右结果
【发布时间】:2011-05-04 18:21:11
【问题描述】:

我低估了>> 运算符的复杂性;它没有像我想象的那样做。

我想将 uint 的值右移 6542454。我认为它是这样工作的:

val (is) == 11000111101010001110110
val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11000111101010001110
val >> 4 == 1100011110101000111
val >> 5 == 110001111010100011
val >> 6 == 11000111101010001
val >> 7 == 1100011110101000 p>

实际上,结果是:

val >> 1 == 1100011110101000111011
val >> 2 == 110001111010100011101
val >> 3 == 11111001100100110010011
val >> 4 == 1111100110010011001001
val >> 5 == 111110011001001100100
val >> 6 == 11111001100100110010
val >> 7 == 10011011111110111111100

第 3 次操作显然做了一些我不明白的事情,并且事情从那里出轨了。似乎在第 7 次手术中又做了我不明白的事情。

连续 7 次使用 >>= 运算符会产生我期望的值:

val >>= 1 == 1100011110101000111011
val >>= 1 == 110001111010100011101
val >>= 1 == 11000111101010001110
val >>= 1 == 1100011110101000111
val >>= 1 == 110001111010100011
val >>= 1 == 11000111101010001
val >>= 1 == 1100011110101000

为什么val >> 3 产生的结果与 3 次调用 val >>= 1 的结果不同?

更新:

using a decimal to binary converter on the web that was truncating my decimal input to 7 digits 是我的错。从 Visual Studio 复制 + 粘贴十进制值时,我没有注意到发生截断。

被移位的实际值是 654245426,正如每个人都正确指出的那样,C# 完美地移位了这个值。

【问题讨论】:

  • 您能否提供一个简单的示例程序来复制该问题?您描述的行为违反了 C# 规范,因此值得检查您是否有其他问题,例如计算移位的代码中的运算符优先级问题。
  • 你能显示你用来打印值的代码吗?您 >>3 在 12 月(8178067)而不是 817806 中显示几乎正确的结果。所以我猜您的打印代码已关闭...

标签: c# bit-shift


【解决方案1】:

我写了代码来输出每个班次:

uint i = 6542454;

for (int j = 0; j < 8; j++)
{
    uint k = i >> j;
    Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}

这正是我所期望和看到的。

6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000

【讨论】:

  • 是的,我只是做了同样的事情,我也得到了预期的结果。
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多