2013-09-26 3 views
0

주어진 모든 변수 유형에 대해 수행 할 일반 작업으로 인접한 두 비트를 서로 바꿔야합니다.알 수없는 변수 유형의 두 비트마다 바꾸기

나는 모든 단일 바이트 필요한 마스크 및 운영의 생각 :

(var & 0x55) << 1 | (var & 0xAA) >> 1 

그러나 어떻게의 정수를 가정 해 봅시다이 적용해야합니까? 위의 마스크를 사용하여 sizeof(int)unsigned char의 배열을 만들고 그런 식으로 작업을 적용해야합니까?

+0

그래서 01101100은 10011100이 될까요? –

+0

예, 정확히 @ LoganMurphy – Quaker

+0

@LoganMurphy "두 비트마다 서로 바꿔 치기"라고 나는 생각한다. –

답변

4

바이트 단위로 할 수 있습니다 (char에 의한 char과 동일). 예를 들어

이 같은

int n = 0xAA55A55A; 
unsigned char *p = (unsigned char *) &n; 

for (; p < (unsigned char *) &n + sizeof(n); p++) 
    *p = (*p & 0x55) << 1 | (*p & 0xAA) >> 1; 
+0

@McMillen 형식을 정정 해 주셔서 감사합니다! – Chen

+0

게시 할 때 문제가되지 않습니다. * 코드 샘플 * 단추는 항상 두 개의 중괄호처럼 보입니다. ** {} ** –

+0

예제를 이해하는 데 어려움을 겪고 있습니다. 'n '은 어디에서 사용합니까? '나'는 뭐니? – Quaker

1

뭔가. 모든 변수의 주소를 char *로 캐스트하면 바이트를 반복 할 수 있습니다.

#include <stdio.h> 

char swap_c(char); 
void swap_r(char *, int); 

int main(void) { 
    char c = 10; 
    c = swap_c(c); 
    printf("%i\n", c); 
    int i = 10; 
    char * r = (char *) &i; //you can cast the address of any variable into a char * 
    swap_r(r, sizeof(int)); 
    printf("%i\n", i); 
} 

void swap_r(char * c, int length) { 
    int i = 0; 
    while(i < length) { 
     c[i] = swap_c(c[i]); 
     i++; 
    }  
} 

char swap_c(char c) { 
    return (c & 0x55) << 1 | (c & 0xAA) >> 1; 
} 

//1010 
//0101 
2

두 가지 제안 : 대신 논리 연산을 사용하여, 당신은 256 개 문자 : 당신이 정적이 조회를 초기화 싶지 않는 경우

char lookUpTable[256] = {0x00, 0x02, 0x01 ...}; 

의 룩업 테이블을 사용할 수 있습니다, 당신은 쓸 수 있습니다 논리 연산을 사용하여 초기화하는 함수.

바이트 b를 바꾸려면 lookUpTable [b]을 쓰거나 함수로 래핑하십시오. 당신은 다음과 같이 이것을 사용

void SwapBits(char* data, size_t len) 
{ 
    For (; len > 0; len--) 
    { 
     *data = lookUpTable[*data]; 
     data++; 
    } 
} 

:이 swapMe의 "내용"대체

AnyType swapMe = whatever; 
SwapBits((char*)(&swapMe), sizeof(AnyType)); 

는 모든 유형의 교환에 관해서는, 당신은 같은 일을 수행하는 함수를 작성.

한 가지 더, 올바른 시프트 동작은 아키텍처에 따라 다르며, 일부 아키텍처는 오른쪽 시프트로 확장됩니다.

SwappedByte = ((Byte >> 1)&0x55) | ((Byte << 1)&0xaa) 

이렇게하면 부호 확장 인공물을 제거 할 수 있습니다.

관련 문제