2008-12-31 6 views
-1

저는 ANSI C++ 코드를 C#으로 포팅하는 중입니다 ... 지금 당장이 문제가 발생합니다.이상한 비트 시프트 동작

두 테스트 모두 value = 6844268입니다.

테스트 코드 : 18273 및 29497을 반환 ++

value >> 12 
value & 0x00000FFF 

C, I는 C 번호 (INT, UINT, 긴, ULONG, INT64에 종류의 가능한 모든 조합을 시도했습니다 C#을 반환 1670 및 3948 반면 .. ..)하지만, C++에는 이동 :(

원래 값이 부호 INT없는 사람은 어떤 아이디어가

편집 : 아아을 내 디버깅을 엉망 대신 값의 배열 [가치]보고 있었다.. 내 잘못.

+0

18273 개 및 29497 값을 보여주는 짧지 만 완전한 C++ 프로그램을 추가하십시오. –

+1

이것은 PEBCAK 오류이므로 더 이상 관련이없는 것으로 표시했습니다. – paxdiablo

+0

@paxdiablo 그리고 이것은 여하튼 여전히 열려 있기 때문에 "재현 할 수 없다"는 이유로 다시 닫으려고했습니다. –

답변

5

오버라이드 된 >> 연산자 코드에 대한 C++ 정의를 확인 하시겠습니까?

C#이 올바른 값을 계산 중입니다. 귀하의 값이 귀하가 말하는 것을 절대적으로 100 % 확신합니까?

그냥 움직임을 통해 이동합니다 :

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

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

가 일치하지 않는, 당신이 거기에 코드에서 표시되지 않는 몇 가지 세부 사항이 있어야합니다.

3

C++이 무엇인지는 모르지만 계산기에서는 C# 값이 정확합니다. 이것은 아마도 부호 확장 문제일까요? (C++ 값은 음수이고, 시프트가 최상위 비트를 끌고 있습니다.)

또한 0xFFF가 4095 인 경우 & 연산이 결과를 반환 할 수있는 방법이 없습니다. 그보다 더 큰 값.

+0

그럴 경우 68844268 >> 12와 18237은 비트 단위로 정렬됩니다. 최상위 비트의 다른 집합? 나는 그것을 보는 방식대로하지 않는다. 그래서 실제로 그가 12 번이나 비트를 쓰고있는 것 같지 않다. * 여기에 수술 단어가있는 것 같습니다 :) –

+0

AND 조작법에 잘 잡히면 나는 그걸 보지 못했습니다! –

+0

네, 기호 확장은 필자가 타이핑 할 때 저에게 일어난 "아웃"생각이었습니다. 나는 그것에 대해 정말로 열심히 생각하지 않았다. –

0

재정의 >> 연산자가 없습니다. 관련 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을 출력 :

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 
+0

당신은 그 cout으로부터 무엇을 얻고, 출력 값 >> 12와 값 & 0xFFF에 cout 코드를 추가 할 수 있으며 결과를 포함하도록 답을 편집 할 수 있습니까? –

+0

나는 첫 번째 글에서 내가 쓴 값을 얻는다. 나는 그것을 분 안에 갱신 할 것이다. –

1

나에게 올바른 것 같은데 ...

[email protected]:~$ g++ test.cc 
[email protected]:~$ ./a.out 
6844268 1670 1670 
6844268 1670 1670 

[email protected]:~$ 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; 
};