2012-09-13 2 views
2

그래서이 문제를 해결하기 위해 노력하고있어 : 당신은 무작위로 32 비트 양의 정수를 부여스와핑 비트

을, 어떤 당신이해야 할 것은 비트의 값에 대한 스왑입니다 3 위, 4 위, 5 위를 24 위, 25 위, 26 위를 차지했다. 이 여기에, 당신은 명시 적으로 솔루션을 원하지 않은 문제가 힌트라고 가정

+0

당신이 처음에 정말로 붙어 있다고 가정합니다. 비트 AND ('&'), 비트 OR ('|'), 왼쪽 쉬프트 (''''), 오른쪽 쉬프트 (''''). 이것 이외에는 작동하지 않는 것을 게시하십시오. –

+1

단어의 진정한 의미에서 숙제가 아니라 스스로 독학하고 질문 할 수없는 질문을합니다. 비트 연산자를 사용해야한다는 것을 잘 알고 있지만이 경우에는 솔루션이 표시되지 않으므로 도움을 요청하기로했습니다. – Leron

+0

그 자체로 "숙제"가 아니라는 것을 분명히하기 위해 감사합니다. 적어도 당신의 생각을 어떻게 풀어 낼 수 있는지 게시 할 수 있습니까? 이것이 자기 교육을위한 것이라고 설명하면 사람들은 너무 빨리 생각할 수 없습니다. – Oded

답변

6

는 : 비트 |를 사용하여 다음 OR 다음의 변화를 수행 &를 사용하여 문제의 비트를 마스크합니다.

0x00000034 마스크와 0x07000000 마스크를 사용하여 비트 24, 25 및 26을 사용하여 비트 3, 4 및 5를 "잘라낼"수 있습니다.

solution을 살펴보면 영감을 얻으려는 문제를 역전시킬 수 있습니다.

편집 : (응답을 "하지 숙제"주석)이이 숙제를하지 않기 때문에, 여기에보다 깊이있는 설명입니다

unsigned int val = ... // your value 
unsigned int bits_03_04_05 = val & 0x00000034; 
unsigned int bits_24_25_26 = val & 0x07000000; 
// Cut out "holes" at bits 3, 4, 5, 24, 25, and 26 of the original value 
unsigned int res = val & ~(0x00000034 | 0x07000000); 
// Put bits 3, 4, and 5 in place 
res |= bits_03_04_05 << 21; 
// Put bits 23, 24, and 25 in place 
res |= bits_24_25_26 >> 21; 
+0

감사합니다. 솔루션을 완전히 이해할 시간이 필요하지만 계속 유지해야 할 필요가 있다고 생각합니다. 감사. – Leron

+0

@Leron Marc Gravell의 대답이 위치 1로 계산되기 시작하는 동안이 대답은 위치 0으로 비트를 계산하기 시작합니다. –

5

방법에 대해 :

// snag the values from 3,4,5 (small) and 24,25,26 (large) 
    int small = value & (7 << 2), large = value & (7 << 23); 

    // remove the old values, and add in the new ones 
    value = (value^(small | large)) | (large >> 21) | (small << 21); 

(비트 1을 LSB로 계산하고, 비트 0이 LSB이면 숫자를 1로 조정)

+0

+1 매우 귀엽다! 특히 "트릭"을 지우는 "XOR". 당신이 비트를 제거했기 때문에, 마지막'^'은'|'로 바꿀 수 있습니다, 맞습니까? – dasblinkenlight

+0

@ dasblinkenlight 흠, 네, 그렇게 생각합니다! –

0

문제를 해결하려면 bi operator&operator|을 초기 정수 값과 mask 사이에 적용하여 조정하십시오.

unsigned int val;// your value 

당신이 마스크를 형성해야합니다 :

는 초기 값이 가정 검색

int setLSB = 1; // 00000001 

int atPosition = 4; 

// shift the set bit 4 positions to the left 
int mask = setLSB << atPosition; // 00010000 

을 한 다음 사용을 명확하고 설정 비트 값 :

// get bit at position 4 
unsigned int valueOfFourthBit = val & mask; 

// clear bit at position 4 and assign to result 
unsigned int res = val & ~(mask); 

// put the value of the 4th bit at wanted position 
int wantedPosition = 21; 
res |= valueOfFourthBit << wantedPosition; 

치밀한 비트, 귀하의 경우 3, 할 수 있습니다 :

int numberOfSetBits = 3; 
int setLSBs = 0 

for (int i =0; i < numberOfSetBits; ++i) 
{ 
    setLSBs += (int) Math.Pow(2, i); 
} 

setLSBs = 7; // 00000111 

// and then the masks for getting 3,4,5 and 24,25,26 bits become 
int smallPosition = 3; 
int largePosition = 24; 

int smallMask = setLSBs << smallPosition; // 0x00000034 
int largeMask = setLSBs << largePosition; // 0x07000000; 

나머지는 기존 답변에 설명되어 있습니다.