int temp = 0x5E; // in binary 0b1011110.
有没有这种方法可以检查temp中的第3位是1还是0而没有位移和屏蔽。
只是想知道是否有一些内置功能,或者我自己不得不写一个。
答案 0 :(得分:145)
在C中,如果要隐藏位操作,可以编写一个宏:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
并以这种方式使用它来检查右端的n th 位:
CHECK_BIT(temp, n - 1)
在C ++中,您可以使用std::bitset。
答案 1 :(得分:77)
检查是否设置了位N(从0开始):
temp & (1 << N)
没有内置功能。</ p>
答案 2 :(得分:21)
如果它是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);
答案 3 :(得分:11)
根据this description of bit-fields,有一种直接定义和访问字段的方法。此条目中的示例如下:
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)
/* ... */
此外,还有警告:
然而,结构中的位成员具有实际缺点。首先,内存中位的排序取决于体系结构,内存填充规则因编译器而异。此外,许多流行的编译器生成用于读写位成员的低效代码,并且由于大多数机器无法操作内存中的任意位组,因此存在与位域相关的严重线程安全问题(尤其是在多处理器系统上)。但必须加载并存储整个单词。
答案 4 :(得分:11)
是的,我知道我不会 “拥有” 这样做。但我通常写道:
/* 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); }
E.g:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
除此之外,这种方法:
答案 5 :(得分:10)
所选答案实际上做错了什么。以下函数将返回位位置或0,具体取决于该位是否实际启用。这不是海报所要求的。
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
这是海报最初寻找的内容。如果该位有效,则下面的函数将返回1或0,而不是位置。
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
答案 6 :(得分:6)
答案 7 :(得分:5)
使用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;
}
答案 8 :(得分:4)
有_bittest内在指令。
答案 9 :(得分:4)
我用这个:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
其中“pos”定义为2 ^ n(例如1,2,4,8,16,32 ......)
返回: 1如果是真的 如果为假,则为0
答案 10 :(得分:3)
我试图读取一个32位整数,它定义了PDF中对象的标志,这对我不起作用
修正它的原因是改变了定义:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
操作数&amp;返回一个整数,其中的标志都是1,并且它没有正确地转换为布尔值,这就是诀窍
答案 11 :(得分:2)
答案 12 :(得分:2)
你可以“模拟”移位和掩蔽:if((0x5e /(2 * 2 * 2))%2)......
答案 13 :(得分:1)
为什么不使用像这样简单的东西?
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
答案 14 :(得分:1)
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos-位位置从0开始。
返回0或1。
答案 15 :(得分:0)
快速和最好的宏
#define get_bit_status() ( YOUR_VAR & ( 1 << BITX ) )
.
.
if (get_rx_pin_status() == ( 1 << BITX ))
{
do();
}
答案 16 :(得分:0)
先例答案向您展示了如何处理位检查,但更常见的是,这全都涉及以整数编码的标志,在任何先例情况下都没有很好地定义
。在典型情况下,标志本身定义为整数,其所引用的特定位的位为1。在下面的示例中,您可以检查整数是否具有标志列表中的ANY标志(串联的多个错误标志)或EVERY标志是否在整数中(串联的多个成功标志)。
下面是一个如何处理整数标志的示例。
可在此处获得实时示例: https://rextester.com/XIKE82408
//g++ 7.4.0
#include <iostream>
#include <stdint.h>
inline bool any_flag_present(unsigned int value, unsigned int flags) {
return bool(value & flags);
}
inline bool all_flags_present(unsigned int value, unsigned int flags) {
return (value & flags) == flags;
}
enum: unsigned int {
ERROR_1 = 1U,
ERROR_2 = 2U, // or 0b10
ERROR_3 = 4U, // or 0b100
SUCCESS_1 = 8U,
SUCCESS_2 = 16U,
OTHER_FLAG = 32U,
};
int main(void)
{
unsigned int value = 0b101011; // ERROR_1, ERROR_2, SUCCESS_1, OTHER_FLAG
unsigned int all_error_flags = ERROR_1 | ERROR_2 | ERROR_3;
unsigned int all_success_flags = SUCCESS_1 | SUCCESS_2;
std::cout << "Was there at least one error: " << any_flag_present(value, all_error_flags) << std::endl;
std::cout << "Are all success flags enabled: " << all_flags_present(value, all_success_flags) << std::endl;
std::cout << "Is the other flag enabled with eror 1: " << all_flags_present(value, ERROR_1 | OTHER_FLAG) << std::endl;
return 0;
}
答案 17 :(得分:0)
为什么所有这些移位操作都需要库函数?如果您具有发布的OP的值:1011110,并且想知道是否设置了位于右侧第3位的位,请执行以下操作:
int temp = 0b1011110;
if( temp & 4 ) /* or (temp & 0b0100) if that's how you roll */
DoSomething();
或者,将来的代码读者可以更容易地解释某些不需要#include的内容:
int temp = 0b1011110;
_Bool bThirdBitIsSet = (temp & 4) ? 1 : 0;
if( bThirdBitIsSet )
DoSomething();
或者,如果您希望它看起来更漂亮:
#include <stdbool.h>
int temp = 0b1011110;
bool bThirdBitIsSet = (temp & 4) ? true : false;
if( bThirdBitIsSet )
DoSomething();
答案 18 :(得分: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
答案 19 :(得分:0)
虽然现在回答已经很晚了,但如果设置了Nth位,可以找到一种简单的方法,只需使用POWER和MODULUS数学运算符。
让我们说我们想知道'temp'是否设置了第N位。如果设置了位,则以下布尔表达式将为true,否则为0。
考虑以下示例:
如果我想知道第3位是否设置,我得
因此表达式返回true,表示设置了第3位。
答案 20 :(得分:0)
如果您只想要一种真正的硬编码方式:
#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;
}
结果:
1 0 1 0
答案 21 :(得分:-1)
我做这个:
LATGbits.LATG0 =((m&0x8)> 0); //检查m的第2位是否为1
答案 22 :(得分:-1)
最快的方式似乎是掩码的查找表