일부 기본 비트 이동 및 비트 논리 연산을 통해이를 수행 할 수 있습니다. 이 그것을 할 수 있습니다 :
는
#include <stdio.h>
#define ALLON(X,S,E) ((X & (~((~0U << E) | ~(~0U << (S - 1))))) == (~((~0U << E) | ~(~0U << (S - 1)))))
/*
Or, simplifying with two macros...
#define ALLMASK(S,E) (~((~0U << E) | ~(~0U << (S - 1))))
#define ALLON(X,S,E) ((X & ALLMASK(S,E)) == ALLMASK(S,E))
*/
char * convert_to_8bit(char * buffer, const unsigned int n)
{
size_t k = 0;
for (unsigned int i = 128; i > 0; i >>= 1) {
if (n & i) {
buffer[k++] = '1';
}
else {
buffer[k++] = '0';
}
}
return buffer;
}
int main(void)
{
char buffer[9] = {0};
printf("1 in binary is %s\n", convert_to_8bit(buffer, 1));
printf("ALLON(1, 2, 4) is %s\n", ALLON(1, 2, 4) ? "true" : "false");
printf("ALLON(1, 1, 1) is %s\n", ALLON(1, 1, 1) ? "true" : "false");
printf("30 in binary is %s\n", convert_to_8bit(buffer, 30));
printf("ALLON(30, 2, 4) is %s\n", ALLON(30, 2, 4) ? "true" : "false");
printf("ALLON(30, 1, 1) is %s\n", ALLON(30, 1, 1) ? "true" : "false");
printf("ALLON(30, 5, 5) is %s\n", ALLON(30, 5, 5) ? "true" : "false");
printf("ALLON(30, 5, 6) is %s\n", ALLON(30, 5, 6) ? "true" : "false");
return 0;
}
출력 :
[email protected]:~/src/sandbox$ ./bs
1 in binary is 00000001
ALLON(1, 2, 4) is false
ALLON(1, 1, 1) is true
30 in binary is 00011110
ALLON(30, 2, 4) is true
ALLON(30, 1, 1) is false
ALLON(30, 5, 5) is true
ALLON(30, 5, 6) is false
[email protected]:~/src/sandbox$
간단히, 우리가 ALLON하고있는 가정 (31, 2, 4) :
~0U << E
는 11111111
왼쪽으로 이동을합니다 그것 4, 그래서 당신은 얻는다 11110000
~0U << (S - 1)
는 11111111
를 잡는다. 그리고 left는 그것을 1로 바꾼다. 그래서 당신은를 얻는다.
~(~0U << (S - 1))
당신이 바로이 당신에게 비트 2, 3, 4는 당신에게 비트는 관심있는 00001110
를 제공합니다 0
- 부정이다
11110001
를 제공 논리합 연산 당신에게 00000001
- 을 제공 한 일을 부정
X
을 ANDing하는 것이 마스크 자체와 같으면 모든 비트가 설정됩니다.
아마도 더 짧은 방법 일 수 있지만이 방법은 이해하기 쉽습니다.
가능한 복제본 [C/C++에서 어떻게 단일 비트를 설정하고 해제하고 토글합니까?] (http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle -a-single-bit-in-cc) – 2501
@DoxyLover : 범위에 걸쳐 반복 할 필요가 없습니다. –
@ 2501 -이 내용이 중복 된 것에 대해서는 동의하지 않습니다. 연결된 질문에서 단일 비트에 대해 이야기합니다. OP는 시작 비트와 종료 비트 수에 의해 지정된 일련의 비트를 원합니다. – DoxyLover