奇怪的位移行为

时间:2008-12-31 08:27:16

标签: c# c bitwise-operators

我正在将一些ANSI C ++代码移植到C#...而这现在正在扼杀我。

两个测试都有value = 6844268

测试代码:

value >> 12
value & 0x00000FFF

C ++返回18273和29497,而C#返回1670和3948.我在C#(int,uint,long,ulong,Int64 ......)中尝试了所有可能的类型组合,但没有去:(

C ++中的原始值是unsigned int。有人有什么想法吗?

编辑:唉,我搞砸了我的调试。正在查看数组[值]而不是值。我的坏。

4 个答案:

答案 0 :(得分:5)

检查您的C ++定义是否包含重写的>>运算符代码?

C#正在计算正确的值,你绝对100%确定你的价值是你所说的吗?

要完成动议:

6844268 = 11010000110111101101100
>> 12   =             11010000110.111101101100
result  =             11010000110
result  = 2 + 4 + 128 + 512 + 1024 = 1670

  18273       =   100011101100001
6844268 >> 12 =       11010000110
                        ^^^^  ^^^ <-- mismatches

他们没有对齐,必须有一些你在代码中没有看到的细节。

答案 1 :(得分:3)

我不知道C ++是做什么的,但在我的计算器上,C#值是正确的;这可能是一个符号扩展问题(C ++值是否定的,并且移位是用它拖动前1位?)

另外,假设0xFFF是4095,那么&amp;操作可以返回大于该值的值。

答案 2 :(得分:1)

对我来说似乎正确......

sock@thebrain:~$ g++ test.cc
sock@thebrain:~$ ./a.out
6844268 1670 1670
6844268 1670 1670

sock@thebrain:~$ cat test.cc
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
unsigned int value = 6844268;
printf("%u %u %u\n", value, value >> 12, (value >> 12)&0xFFF);
cout << value << " ";
cout << (value>>12) << " ";
value = (value>>12)&0xFFF;
cout << value << endl;
return 0;
};

答案 3 :(得分:0)

没有被覆盖的&gt;&gt;运营商。这是相关的C ++代码片段:

[Function signature: const unsigned char *src, int len, char *dst]
unsigned short *sdst = (unsigned short*) dst;
unsigned short *slt = (unsigned short*) lookup_ext;

while (len >= 3) {
    unsigned int value = *src++ << 16;
    value |= *src++ << 8;
    value |= *src++;

    cout << value << endl;
    *sdst++ = slt[value >> 12];
    *sdst++ = slt[value & 0x00000FFF];

    cout << sizeof(unsigned short) << endl << slt[value >> 12] << endl << slt[value & 0x00000FFF] << endl;
    len -= 3;
}

cout为狼栅栏调试添加了。

cout输出:

6844268 | cout << value
2 | sizeof(unsigned short)
18273 | slt... Ohhhh sneaky. I mis-pasted that, nevermind - it's an slt issue [Output's the same now]
29497