구글 검색과 위키피디아 읽기를 시도했지만, 왼쪽/오른쪽에 비트 시퀀스를 덧붙이라는 명령이 없다면 언급하지 않았습니다. 예를 들어, 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
으로 입력해야합니다. 또한, 우리가 추가를 사용하더라도 그것을 단순화 할 수 없기 때문에 또한.
관련 문제
- 1. TabControl의 오른쪽과 왼쪽에있는 탭 C#
- 2. div의 오른쪽과 왼쪽에있는 틈을 제거 할 수있는 방법
- 3. Android : 비트 맵 오른쪽에 패딩 추가
- 4. C 구조의 64 비트 정렬/패딩?
- 5. C#에서 SMS 연결을위한 GSM7 비트 패딩
- 6. Rijndael 알고리즘 (오른쪽 8 비트 패딩 문제)
- 7. 왼쪽에있는 모든 FB 덧글보기
- 8. TreeView의 왼쪽에있는 WPF CheckBox
- 9. JComponent의 왼쪽에있는 SetTitlePosition
- 10. JTabbedPane : 탭의 왼쪽에있는 아이콘
- 11. 왼쪽에있는 메뉴가있는 .NET 컨테이너
- 12. 델파이 XE 32 비트 부호있는 표현
- 13. 작은 메모리에 매우 큰 비트 배열 표현
- 14. Java DecimalFormat 왼쪽에있는 모든 숫자가
- 15. 프레임 레이아웃의 왼쪽에있는 버튼은 무엇입니까?
- 16. 요소의 아래쪽 여백/패딩 IE
- 17. SWT에서 위젯의 오른쪽과 아래에 간격 추가하기
- 18. 버튼 필드를 오른쪽과 아래쪽으로 설정합니다 (검은 딸기)
- 19. MD2 해시 패딩
- 20. 패딩 명령어에 실제적인 이점이 있습니까?
- 21. 표현
- 22. pcks5 패딩
- 23. 패딩 문제가
- 24. 패딩 권리는
- 25. 탐색 패딩
- 26. QScrollArea의 패딩
- 27. UITabBar 패딩
- 28. 단 정밀도 부동 소수점 부정을위한 비트 수준 표현
- 29. 패딩 및 선 높이를 FF로 올바르게 표시하려고합니다.
- 30. BIRT Chart API에서 캡션을 등호가있는 문자열로 설정하면 왼쪽에있는 값이 잘립니다.