2014-05-15 3 views
-2
int samples = 8; 

for (unsigned int i = 0; i < (pow(double(2),samples)-1); i++) 
{ 
unsigned int number = i << 1; 
} 

OpenCv 라이브러리를 사용하여 C++로 코딩하고 있습니다. 이것을 통해 비트 시프트를하고 싶습니다.이 값은 0-255의 범위에 있어야하지만 255 범위를 넘어 508까지갑니다.16 비트 정수의 데이터 값을 잃지 않고 8 비트로 변환하는 방법 16 비트 정수의 범위가 0-255 일 때

IN 비트 시프트 연산자는 0-255 사이의 범위를 유지합니다. matlab에있는 패턴은 0,2,4 ... 254,1,3,5 ... 255입니다. 하지만 C++에서는 0,2,4,254,256,258 ... 508입니다. 나는 matlab과 같은 대답을 원한다. 저에게 그 아이디어를 제안 해주십시오.

+0

하여 시뮬레이션 할 수 있습니다 ref/bitshift.html). 사실, 8 비트 너비의 –

답변

2

(당신이 보여 순서에 따라 계신 것 같습니다) 순서 0, 2, 4, 6, ..., 252, 254, 1, 3, 5, ..., 253, 255를 생성 할 수 있습니다 :

그래서, 당신은 사용할 수 있음을 얻을 수

for (int i = 0; i != 257; i = (i == 254) ? 1 : i + 2) 
    doSomethingWith (i); 

루프의 본문을 작게 유지할 수 있다면 아마도 더 읽기 쉬운 이중 루프 버전을 포함하여 해당 순서를 생성하는 다른 방법이 많이 있습니다.

for (int i = 0; i < 256; i += 2) doSomethingWith (i); // 0, 2, 4, 6, ..., 254 
for (int i = 1; i < 256; i += 2) doSomethingWith (i); // 1, 3, 5, 7, ..., 255 
+0

thnks 나는 대답했다. – hawkeye

4

i이 부호없는 정수인 경우 i << 1i * 2과 같습니다.

이것은 "16 비트 정수를 8 비트로 변환"과 아무 관련이 없습니다. 이를 수행하는 한 가지 방법은 하위 8 : (number & 0xFF) 또는 동일하게 (number % 256)을 제외한 모든 비트를 마스크 해제하는 것입니다.

2를 곱한 다음이 변환을 수행하면 다음에 0이 표시됩니다. 그러나 그것은 당신이 원하는 것이 아닙니다. 귀하의 목표 출력은 1으로 하반기에 추가되었습니다.

for (int i = 0; i < 256; i++) 
    number = (i * 2) % 256 + (i >= 128); 
+0

인 [rotate left] (http://www.mathworks.com.au/help/fixedpoint/ref/bitrol.html)은 Matlab에서 255의 값을 생성하므로 –

+0

그래, 나중에 보았습니다 –

+0

이것은 원하는 시퀀스'0,2,4 ... 254,1,3,5 ... 255'을 제공하지 않고'0, 0, 0, ...'광고 무한대. 두 개를 곱하는 것이 아니라 어떻게 든 두 개가 있어야합니다. – paxdiablo

1

abcdefgh << 1bcdefgha 일 때 Matlab이 원형 8 비트 시프트를 수행하는 것처럼 보입니다. C++는 그런 일이 없다, 그러나 당신은이 시퀀스는 [bitshift에 대한 matlab에 문서 (http://www.mathworks.com.au/help/matlab/ 일치하지 않는 것

number = ((i << 1) && 0xff) | (i>> 7);