문제

바이트를 사용하여 깃발과 같은 깃발을 저장합니다 10101010그리고 특정 비트가 1 또는 0.

도움이 되었습니까?

해결책

다음은 원하는 비트를 테스트하는 데 사용할 수있는 기능입니다.

bool is_bit_set(unsigned value, unsigned bitindex)
{
    return (value & (1 << bitindex)) != 0;
}

약간의 설명 :

왼쪽 시프트 연산자 (<<)는 약간의 마스크를 만드는 데 사용됩니다. (1 << 0)은 00000001과 같을 것입니다. (1 << 1)은 00000010과 같을 것입니다. (1 << 3)은 00001000 등과 같습니다. 31의 이동은 32 비트 값의 가장 왼쪽 비트입니다.

비트와 연산자 (&)는 양쪽에 1 인 모든 비트가 설정된 결과를 제공합니다. 예 : 1111 & 0001 = 0001; 1111 & 0010 == 0010; 0000 & 0001 = 0000. 따라서, vaction (& (1 << bitindex))는 연관된 비트가 값이 1 인 경우 비트 마스크를 반환하거나 관련 비트가 0 인 경우 0을 반환합니다.

마지막으로 결과가 0이 아닌지 확인합니다. (이것은 실제로 제외 될 수 있지만, 나는 그것을 명시 적으로 만들고 싶습니다.)

다른 팁

@daoks의 연장으로 답변

비트 조작을 할 때 진짜 매우 확실한 지식을 갖는 데 도움이됩니다 비트 타이어 운영자.

또한 Bitwise "및"C의 연산자는 &, 당신이하고 싶은 것은 다음과 같습니다.

unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check

if(a & b) {
    //bit set
}

else {
    //not set
}

위의 나는 비트를 사용하여 특정 비트가 설정되었는지 여부를 확인하기 위해 BitWise "및"(& c)를 사용했습니다. 또한 이진수를 공식화하는 두 가지 방법을 사용했습니다. 위의 Wikipedia 링크를 확인하는 것이 좋습니다.

A와 연산자를 사용할 수 있습니다. 예를 들어 : 10101010과 당신은 할 수있는 세 번째 비트를 확인하려고합니다 : (10101010 및 00100000) 00100000을 얻으면 깃발이 세 번째 위치에 1의 1 개가 있다는 것을 알고 있습니다.

C ++를 사용하고 있으며 표준 라이브러리가 허용되면 깃발을 비트 세트에 보관하는 것이 좋습니다.

#include <bitset>
//...
std::bitset<8> flags(someVariable);

그런 다음 [] 인덱싱 연산자를 사용하여 플래그를 확인하고 설정할 수 있습니다.

Kristopher Johnson의 대답은 이와 같은 개별 분야와 함께 일하는 것을 좋아한다면 매우 좋습니다. C에서 비트 필드를 사용하여 코드를 쉽게 읽을 수 있도록 선호합니다.

예를 들어:

struct fieldsample
{
  unsigned short field1 : 1;
  unsigned short field2 : 1;
  unsigned short field3 : 1;
  unsigned short field4 : 1;
}

여기에는 각각 1 비트 크기의 4 개의 필드가있는 간단한 구조물이 있습니다. 그런 다음 간단한 구조 액세스를 사용하여 코드를 작성할 수 있습니다.

void codesample()
{
  //Declare the struct on the stack.
  fieldsample fields;
  //Initialize values.
  fields.f1 = 1;
  fields.f2 = 0;
  fields.f3 = 0;
  fields.f4 = 1;
  ...
  //Check the value of a field.
  if(fields.f1 == 1) {}
  ...
}

필드에 구조 내부의 의미있는 이름을 줄 수 있기 때문에 동일한 작은 크기의 이점과 읽을 수있는 코드를 얻을 수 있습니다.

지금까지는 아무도 틀리지 않았지만 임의의 비트를 확인하는 방법을 제공합니다.

int checkBit( byte in, int bit )
{
  return in & ( 1 << bit );
}

함수가 0이 아닌 것을 반환하면 비트가 설정됩니다.

byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set

int isThirdBitSet(byte in) {
 return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}

Daok가 말한대로 할 수 있으며 약간의 비트 또는 이전 및 작업 결과를 얻을 수 있습니다. 이 경우 1 또는 0의 최종 결과가 나타납니다.

전통적으로 가장 낮은 비트가 설정되어 있는지 확인하려면 다음과 같은 것처럼 보입니다.

int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
    doSomething();

비트 마스크와 비교하여 비트 마스크와 비교하려면 약간 (논리적이지 않습니다!)를 사용하십시오.

if (var & 0x08) {
  /* the fourth bit is set */
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top