구글 검색과 위키피디아 읽기를 시도했지만, 왼쪽/오른쪽에 비트 시퀀스를 덧붙이라는 명령이 없다면 언급하지 않았습니다. 예를 들어, 01000은 010001111이 될 것입니다. 비트 마스킹을 사용하면이 작업을 수행 할 수 있지만 기술은 다소 느립니다. 그래서 C에서 이것을하는 표준 방법은 무엇입니까? 패드 오른쪽 (최하위 비트)에 n
1 비트 값 i
으로오른쪽과 왼쪽에있는 패딩 비트 표현
1
A
답변
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
을, 나는 비트 수의 원래 번호 x
및 n
를 사용합니다 패드.
오른쪽 (최하위) 패딩 :
이(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
으로 입력해야합니다. 또한, 우리가 추가를 사용하더라도 그것을 단순화 할 수 없기 때문에 또한.