2010-08-03 7 views

답변

1
unsigned char swapped = ((original & 85) << 1) | ((original & 170) >> 1); 
0

당신은 비트 시프트 >>을 사용할 수

+0

마찬가지로 비트 위치 34, 56, 78, ... – Muthuraman

0

here 언급.

+0

네 번째와 두 번째 비트 위치 값을 바꾸려면 쌍과 같은 비트 위치 쌍을 교환해야합니까? – Muthuraman

8
int pairwise_bit_swap(int a) { 
    return ((a & 0x55555555L) << 1) | ((a & 0xAAAAAAAAL) >> 1); 
} 
+0

+1. 합리적으로 명확한 기술을 사용하는 아주 간단한 코드. 이식성 노트로서, 일부 컴파일러는이 코드가 int가 잘리는 원인이되는 충분히 큰 범위의 int를 사용할 수도 있습니다. – Brian

+1

부호있는 정수를 오른쪽으로 시프트하면 부호 비트가 전파됩니다. 즉, a가 음수이면 결과의 첫 번째 비트는 두 번째에 관계없이 1이됩니다. 부호없는 int를 원한다고 생각합니다. 즉, 2의 보수로 나타내는 값이 아닌 비트 패턴에 관심이 있습니다. 만약 당신이 정말로 정수가 필요하다면, 그것을 즉시 캐스팅 할 수 있습니다 : ((a & 0x55555555) << 1) | ((((unsigned int) a) & 0xAAAAAAAA) >> 1) 또는 "수동"으로 지우십시오. ((& 0x55555555) << 1) | (((a & 0xAAAAAAAA) >> 1) & 0x7FFFFFFF) –

+0

또한 32 비트 정수에서만 작동합니다. int가 64 비트라면 마지막에 L을 넣는다는 사실은 도움이되지 않습니다! –

0

부호 숯 A, X, Y, Z (스왑 쌍 비트 1 2 3 4 5 6 7 8 등)에도 위치에 스왑 홀수 위치 비트를 원한다면 ;
a = 2 + 4 + 8 + 128;
x = a & 170;
y = a &85;
z = (x >> 1) | (y < <1);

Z가 답입니다.

마찬가지로 16 비트를 스왑 할 수 있습니다. 위의 예제 시나리오를 해결하십시오 ...

0
((x << 1) & 0xAAAAAAAA) |((x >>1) & 0x55555555) 

여기서 x는 숫자입니다.

관련 문제