답변:
C에서 비트 조작을 숨기려면 매크로를 작성할 수 있습니다.
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
이 방법을 사용 하여 오른쪽 끝에서 n 번째 비트 를 확인합니다 .
CHECK_BIT(temp, n - 1)
C ++에서는 std :: bitset을 사용할 수 있습니다 .
!= 0
것이 사실이므로 왜 귀찮게합니까? 1
는 정확히 0.1415
!
std::bitset
정말? 물론, 단일 비트를 확인하기 위해 약간의 작업 (그리고 잠재적으로 정말 멋진 템플릿)을 수행하는 대신 각 '비트'를 사용하지 않는 unsigned long
. 공간 낭비입니다!
C ++ 인 경우 std :: bitset을 사용합니다. 단순한. 똑바로. 어리석은 오류의 가능성이 없습니다.
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
또는이 어리 석음은 어떻습니까
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
std::bitset<CHAR_BIT * sizeof(int)>
훨씬 더 정확합니다
그래, 내가하지 않습니다 알고 "이" 이런 식으로 할 수 있습니다. 그러나 나는 보통 다음과 같이 씁니다.
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
예 :
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
무엇보다도이 접근 방식은 다음과 같습니다.
선택한 답변이하는 일은 실제로 잘못되었습니다. 아래 함수는 비트가 실제로 활성화되었는지 여부에 따라 비트 위치 또는 0을 반환합니다. 이것은 포스터가 요구 한 것이 아닙니다.
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
포스터가 원래 찾고 있던 것이 여기 있습니다. 아래 함수는 비트가 활성화되고 위치가 아닌 경우 1 또는 0을 반환합니다.
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
이중 부정 없이도 할 수 있다는 것을 아는 것이 좋다와 같이 사용하는 동안 방금 만난 정확한 문제 입니다.
이 비트 필드 설명에 따르면 필드를 직접 정의하고 액세스하는 방법이 있습니다. 이 항목의 예는 다음과 같습니다.
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
또한 경고가 있습니다.
그러나 구조체의 비트 멤버에는 실질적인 단점이 있습니다. 첫째, 메모리의 비트 순서는 아키텍처에 따라 다르며 메모리 패딩 규칙은 컴파일러마다 다릅니다. 또한 널리 사용되는 많은 컴파일러는 비트 멤버를 읽고 쓰기 위해 비효율적 인 코드를 생성하며, 대부분의 컴퓨터가 메모리에서 임의의 비트 세트를 조작 할 수 없다는 사실로 인해 비트 필드 (특히 다중 프로세서 시스템에서)와 관련된 잠재적으로 심각한 스레드 안전 문제가 있습니다. 대신 전체 단어를로드하고 저장해야합니다.
std :: bitset 사용
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
temp
"빅 엔디안"으로 만들기 위해 값 을 반영 할 필요가 없습니까?
즉, _bittest 내장 명령어가 있습니다.
나는 이것을 사용한다 :
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
여기서 "pos"는 2 ^ n (ig 1,2,4,8,16,32 ...)으로 정의됩니다.
반환 값 : 참이면 1 거짓이면 0
4 = 2^(3-1)
질문의 일부 였으므로 비트 위치 3에 대해 사용하도록 명시 적으로 명시해야합니다 .
PDF의 개체에 대한 플래그를 정의한 32 비트 정수를 읽으려고했는데 이것이 저에게 작동하지 않았습니다.
수정 사항은 정의를 변경하는 것입니다.
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
피연산자는 & 둘 다 1에있는 플래그와 함께 정수를 반환하고 부울로 제대로 캐스팅되지 않았습니다.
!= 0
똑같이 할 것입니다. 생성 된 기계 명령어가 어떻게 다를 수 있는지 모릅니다.
시프트 및 마스킹을 "시뮬레이션"할 수 있습니다. if ((0x5e / (2 * 2 * 2)) % 2) ...
이렇게 간단한 것을 사용하지 않겠습니까?
uint8_t status = 255;
cout << "binary: ";
for (int i=((sizeof(status)*8)-1); i>-1; i--)
{
if ((status & (1 << i)))
{
cout << "1";
}
else
{
cout << "0";
}
}
출력 : 바이너리 : 11111111
std::cout << (((status & (1 << i)) ? '1' : '0');
. 당신은 사용해야 CHAR_BIT
에서 상수를 <climits>
이 경우에 당신은 결과를 알고 있지만 당신이 사용하고 있기 때문에 어쨌든 8 될 것 대신에 하드 코딩 8 비트uint8_t
진짜 하드 코딩 된 방법을 원한다면 :
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
이 hw 종속적이며이 비트 순서가 7654 3210이고 var가 8 비트라고 가정합니다.
#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
int temp =0x5E;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x00;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0x04;
printf(" %d \n", IS_BIT3_SET(temp));
temp = 0xfb;
printf(" %d \n", IS_BIT3_SET(temp));
scanf("waitng %d",&temp);
return 0;
}
결과 :
1010
지금 대답하기에는 꽤 늦었지만, 간단히 POWER 및 MODULUS 수학 연산자를 사용하여 N 번째 비트가 설정되었는지 여부를 찾을 수있는 간단한 방법이 있습니다.
'temp'에 N 번째 비트가 설정되어 있는지 알고 싶다고 가정 해 보겠습니다. 다음 부울 표현식은 비트가 설정되면 true를, 그렇지 않으면 0을 제공합니다.
다음 예를 고려하십시오.
세 번째 비트가 설정되어 있는지 알고 싶다면
따라서 expression은 3 번째 비트가 설정되었음을 나타내는 true를 반환합니다.
한 가지 접근 방식은 다음 조건 내에서 확인합니다.
if ( (mask >> bit ) & 1)
설명 프로그램은 다음과 같습니다.
#include <stdio.h>
unsigned int bitCheck(unsigned int mask, int pin);
int main(void){
unsigned int mask = 6; // 6 = 0110
int pin0 = 0;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
unsigned int bit0= bitCheck( mask, pin0);
unsigned int bit1= bitCheck( mask, pin1);
unsigned int bit2= bitCheck( mask, pin2);
unsigned int bit3= bitCheck( mask, pin3);
printf("Mask = %d ==>> 0110\n", mask);
if ( bit0 == 1 ){
printf("Pin %d is Set\n", pin0);
}else{
printf("Pin %d is not Set\n", pin0);
}
if ( bit1 == 1 ){
printf("Pin %d is Set\n", pin1);
}else{
printf("Pin %d is not Set\n", pin1);
}
if ( bit2 == 1 ){
printf("Pin %d is Set\n", pin2);
}else{
printf("Pin %d is not Set\n", pin2);
}
if ( bit3 == 1 ){
printf("Pin %d is Set\n", pin3);
}else{
printf("Pin %d is not Set\n", pin3);
}
}
unsigned int bitCheck(unsigned int mask, int bit){
if ( (mask >> bit ) & 1){
return 1;
}else{
return 0;
}
}
산출:
Mask = 6 ==>> 0110 Pin 0 is not Set Pin 1 is Set Pin 2 is Set Pin 3 is not Set
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos-0부터 시작하는 비트 위치.
0 또는 1을 반환합니다.