Answers:
在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
。多么浪费空间!
检查是否设置了N位(从0开始):
temp & (1 << N)
没有内置功能。
1 << 0
?? 对不起,很困惑。
1<<0
,这是1,没有任何班次(班次0),这是1<<0 == 1
如果是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
不需要将其价值体现为“ big-endian”吗?
有,即_bittest内部指令。
您可以“模拟”移位和屏蔽: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 )
请注意,这与硬件相关,并假定该位顺序为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;
}
结果是:
1 0 1 0
一种方法是在以下情况下进行检查:
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