C의 정수 값에서 비트 단위의 데이터를 얻으려면 어떻게 해야 합니까?
10진수의 비트를 추출하고 싶습니다.
예를 들어, 7은 바이너리 0111이며, bool에 저장된 모든 비트를 01 1 1로 얻으려고 합니다.어떻게 하면 될까요?
좋아요, 루프는 좋은 옵션이 아닙니다.다른 방법이 있을까요?
n의 k번째 비트를 원하시면
(n & ( 1 << k )) >> k
여기서는 마스크를 만들고 마스크를 n에 적용한 다음 마스크된 값을 오른쪽으로 이동하여 원하는 비트만 가져옵니다.다음과 같이 보다 상세하게 기술할 수 있습니다.
int mask = 1 << k;
int masked_n = n & mask;
int thebit = masked_n >> k;
비트 마스킹에 대한 자세한 내용은 여기를 참조하십시오.
다음은 프로그램입니다.
#include <stdio.h>
#include <stdlib.h>
int *get_bits(int n, int bitswanted){
int *bits = malloc(sizeof(int) * bitswanted);
int k;
for(k=0; k<bitswanted; k++){
int mask = 1 << k;
int masked_n = n & mask;
int thebit = masked_n >> k;
bits[k] = thebit;
}
return bits;
}
int main(){
int n=7;
int bitswanted = 5;
int *bits = get_bits(n, bitswanted);
printf("%d = ", n);
int i;
for(i=bitswanted-1; i>=0;i--){
printf("%d ", bits[i]);
}
printf("\n");
}
요청하신 대로 검지의 답변에 대한 코멘트를 본격적인 답변으로 확대하기로 했습니다.그의 대답은 맞지만, 그것은 불필요하게 복잡하다.또한 현재 답변은 모두 서명된 것을 사용합니다.int
s: 값을 나타냅니다.음수 값의 오른쪽 시프트는 구현 정의(즉, 포터블이 아님)되고 왼쪽 시프트는 정의되지 않은 동작을 초래할 수 있으므로 이는 위험합니다(이 질문 참조).
원하는 비트를 최하위 비트 위치로 우회전시킴으로써 마스킹을 수행할 수 있습니다.1
. 각 비트에 대해 새로운 마스크 값을 계산할 필요가 없습니다.
(n >> k) & 1
완전한 프로그램으로서 일련의 단일 비트 값을 계산(그 후 인쇄)합니다.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
unsigned
input = 0b0111u,
n_bits = 4u,
*bits = (unsigned*)malloc(sizeof(unsigned) * n_bits),
bit = 0;
for(bit = 0; bit < n_bits; ++bit)
bits[bit] = (input >> bit) & 1;
for(bit = n_bits; bit--;)
printf("%u", bits[bit]);
printf("\n");
free(bits);
}
이 경우처럼 특정 비트가 아닌 모든 비트를 계산한다고 가정하면 루프는 다음과 같이 변경할 수 있습니다.
for(bit = 0; bit < n_bits; ++bit, input >>= 1)
bits[bit] = input & 1;
이것에 의해 변경된다.input
따라서 일정한 폭의 싱글비트 시프트를 사용할 수 있습니다.이는 일부 아키텍처에서 더 효율적일 수 있습니다.
이를 위한 한 가지 방법은 다음과 같습니다.
bool b[4];
int v = 7; // number to dissect
for (int j = 0; j < 4; ++j)
b [j] = 0 != (v & (1 << j));
루프를 사용하는 것이 바람직하지 않은 이유는 이해하기 어렵지만 루프를 전개하는 것은 간단합니다.
bool b[4];
int v = 7; // number to dissect
b [0] = 0 != (v & (1 << 0));
b [1] = 0 != (v & (1 << 1));
b [2] = 0 != (v & (1 << 2));
b [3] = 0 != (v & (1 << 3));
또는 마지막 4개의 문장의 상수 표현 평가:
b [0] = 0 != (v & 1);
b [1] = 0 != (v & 2);
b [2] = 0 != (v & 4);
b [3] = 0 != (v & 8);
사용.std::bitset
int value = 123;
std::bitset<sizeof(int)> bits(value);
std::cout <<bits.to_string();
여기 매우 간단한 방법이 있습니다.
int main()
{
int s=7,l=1;
vector <bool> v;
v.clear();
while (l <= 4)
{
v.push_back(s%2);
s /= 2;
l++;
}
for (l=(v.size()-1); l >= 0; l--)
{
cout<<v[l]<<" ";
}
return 0;
}
루프가 필요 없는 경우는, 기입해 주세요.
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int num = 7;
#if 0
bool arr[4] = { (num&1) ?true: false, (num&2) ?true: false, (num&4) ?true: false, (num&8) ?true: false };
#else
#define BTB(v,i) ((v) & (1u << (i))) ? true : false
bool arr[4] = { BTB(num,0), BTB(num,1), BTB(num,2), BTB(num,3)};
#undef BTB
#endif
printf("%d %d %d %d\n", arr[3], arr[2], arr[1], arr[0]);
return 0;
}
여기서 나타내듯이, 이것은 이니셜라이저에서도 동작합니다.
@prateek, 잘 부탁드립니다.프로그램에서 사용할 수 있도록 코멘트로 기능을 다시 작성했습니다.더 많은 비트에 대해 8을 증가시킵니다(정수의 경우 최대 32).
std::vector <bool> bits_from_int (int integer) // discern which bits of PLC codes are true
{
std::vector <bool> bool_bits;
// continously divide the integer by 2, if there is no remainder, the bit is 1, else it's 0
for (int i = 0; i < 8; i++)
{
bool_bits.push_back (integer%2); // remainder of dividing by 2
integer /= 2; // integer equals itself divided by 2
}
return bool_bits;
}
#include <stdio.h>
int main(void)
{
int number = 7; /* signed */
int vbool[8 * sizeof(int)];
int i;
for (i = 0; i < 8 * sizeof(int); i++)
{
vbool[i] = number<<i < 0;
printf("%d", vbool[i]);
}
return 0;
}
언급URL : https://stackoverflow.com/questions/2249731/how-do-i-get-bit-by-bit-data-from-an-integer-value-in-c
'programing' 카테고리의 다른 글
Trix HTMLSanitizer를 재정의하여 클래스에서 스판 태그를 허용하는 방법 (0) | 2022.06.25 |
---|---|
v-for를 사용하여 반복할 때 vuej가 크래시됨 (0) | 2022.06.25 |
Vue.js 2에서 라우터 인스턴스를 내보내는 방법 (0) | 2022.06.25 |
Vuejs를 사용하여 여러 선택 옵션(드롭다운)에서 목록을 필터링하는 방법 (0) | 2022.06.25 |
UI 프레임워크의 '개별 구성 요소 가져오기' 실행으로 Vue js 앱의 성능이 향상됩니까? (0) | 2022.06.25 |