2012-10-05 3 views
1

구글 검색과 위키피디아 읽기를 시도했지만, 왼쪽/오른쪽에 비트 시퀀스를 덧붙이라는 명령이 없다면 언급하지 않았습니다. 예를 들어, 01000은 010001111이 될 것입니다. 비트 마스킹을 사용하면이 작업을 수행 할 수 있지만 기술은 다소 느립니다. 그래서 C에서 이것을하는 표준 방법은 무엇입니까? 패드 오른쪽 (최하위 비트)에 n 1 비트 값 i으로오른쪽과 왼쪽에있는 패딩 비트 표현

답변

1
#include <limits.h> 
#include <assert.h> 
#include <stdio.h> 

unsigned pad(unsigned pattern, unsigned patternLen, 
      unsigned leftBit, unsigned leftBitCnt, 
      unsigned rightBit, unsigned rightBitCnt) 
{ 
    unsigned r; 
    assert(leftBitCnt < sizeof(unsigned) * CHAR_BIT); 
    assert(rightBitCnt < sizeof(unsigned) * CHAR_BIT); 
    assert(patternLen < sizeof(unsigned) * CHAR_BIT); 
    assert(leftBitCnt + patternLen + rightBitCnt <= sizeof(unsigned) * CHAR_BIT); 

    r = (leftBit << leftBitCnt) - leftBit; 
    r <<= patternLen; 
    r |= pattern; 
    r <<= rightBitCnt; 
    r |= (rightBit << rightBitCnt) - rightBit; 

    return r; 
} 

void printBin(unsigned x) 
{ 
    unsigned i; 
    for (i = 0; i < sizeof(unsigned) * CHAR_BIT; i++) 
    printf("%u", (x >> (sizeof(unsigned) * CHAR_BIT - 1 - i)) & 1); 
    printf("\n"); 
} 

int main(void) 
{ 
    printBin(pad(0x0F0, 12, 0, 2, 0, 2)); 
    printBin(pad(0x0F0, 12, 0, 2, 1, 2)); 
    printBin(pad(0x0F0, 12, 1, 2, 0, 2)); 
    printBin(pad(0x0F0, 12, 1, 2, 1, 2)); 
    return 0; 
} 

출력 (ideone)

00000000000000000000001111000000 
00000000000000000000001111000011 
00000000000000001100001111000000 
00000000000000001100001111000011 
1

, 당신은 계산할 수 있습니다 모두 들어

(i + 1 << n) - 1 
1

을, 나는 비트 수의 원래 번호 xn를 사용합니다 패드.

오른쪽 (최하위) 패딩 :

(x + 1 << n) - 1 

가 어떻게 거기 않았다

난 당신이 거리로 얻을 수있는 최소한의 작업을 생각? 먼저 x을 ( x << n) 이상으로 시프트하십시오. 이제 우리는 그것을 원하지만 0으로 채워집니다. (1 << n) - 1으로 1의 올바른 번호를 얻을 수 있습니다. 자, 보통 우리는 비트 - 또는 그것들을 함께 사용합니다. 그러나 그 중 하나에있는 1은 모두 다른쪽에 0으로 정렬되어 있기 때문에 추가 할 수도 있습니다. 다음은 간단하게합시다 : (x << n) + (1 << n) - 1 = (x + 1 << n) - 1. +/ -<</ >> 작업 이전에 발생합니다.

왼쪽 (가장 중요한 패딩) :이 모든 것들이기 때문에

x | -1 << BIT_WIDTH - n 

첫째, 우리는 -1를 사용합니다. 나는 이것이 서명되어 있다고 가정하고있다; 그렇지 않은 경우 MAX_INT을 사용하거나 x 유형의 상대 상수를 사용하십시오. 그런 다음 BIT_WIDTH - n 슬롯 위로 1 개를 모두 이동하면 정확한 자리에 n 1이 남습니다. 여기에서 x은 잠재적으로 패딩 될 위치에 1을 가질 수 있으므로 비트 단위로 또는 x으로 입력해야합니다. 또한, 우리가 추가를 사용하더라도 그것을 단순화 할 수 없기 때문에 또한.