我使用一个字节来存储一些标志,如<code>10101010
这里有一个函数,可以用来测试任何位
:
bool is_bit_set(unsigned value, unsigned bitindex)
{
return (value & (1 << bitindex)) != 0;
}
解释:
(1 << 0)
equals00000001
(1 << 1)
equals00000010
(1 << 3)
equals00001000
因此,<code>0</code>的移位测试最右边的位。31
的移位将是32位值的最左边的一位。
逐位和运算符(&;
)给出一个结果,其中设置了两侧1
的所有位。示例:
1111 & 0001
equals0001
1111 & 0010
equals0010
0000 & 0001
equals0000
.
因此,表达式:
(value & (1 << bitindex))
will return the bitmask if the associated bit (bitindex
) contains a 1
in that position, or else it will return 0
(meaning it does not contain a 1
at the assoicated bitindex
).
为了简化,表达式测试结果是否大于零
。
- If
Result > 0
returnstrue
, meaning the byte has a1
in the testedbitindex
position. - All else returns
false
meaning the result was zero, which means there s a0
in testedbitindex
position.
注意!=语句中不需要0
,因为它是bool,但我喜欢把它说清楚。
在进行位操作时,确实有助于对按位运算符。
此外,C中的按位“AND”运算符是&代码>,所以您想这样做:
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
}
上面我使用了按位“与”(C中的&;)来检查是否设置了特定的位。我还使用了两种不同的方式来表示二进制数。我强烈建议你查看上面的维基百科链接。
您可以使用AND运算符。你有一个例子:10101010,你想检查你可以做的第三位:(10101010 and 00100000),如果你得到00100000,你就知道你在第三个位置的标志是1。
Kristopher Johnson的答案非常好,如果你喜欢处理这样的单个字段。我更喜欢通过在C中使用位字段来使代码更容易阅读。
例如:
struct fieldsample
{
unsigned short field1 : 1;
unsigned short field2 : 1;
unsigned short field3 : 1;
unsigned short field4 : 1;
}
这里有一个简单的结构,有四个字段,每个字段的大小为1位。然后,您可以使用简单的结构访问来编写代码。
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) {}
...
}
您可以获得同样的小尺寸优势,加上可读代码,因为您可以在结构中为字段提供有意义的名称。
如果您使用C++并且允许使用标准库,我建议将您的标志存储在位集中:
#include <bitset>
//...
std::bitset<8> flags(someVariable);
这样,您就可以使用[]索引运算符来检查和设置标志。
到目前为止,没有人错,但要给出一种检查任意位的方法:
int checkBit( byte in, int bit )
{
return in & ( 1 << bit );
}
如果函数返回非零,则设置该位。
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
}
传统上,为了检查是否设置了最低位,这看起来像是:
int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
doSomething();
您可以按Patrick Desjardins说,然后对上一次and运算的结果进行位对位OR运算。
在这种情况下,您将得到1或0的最终结果。
使用逐位(非逻辑!)AND将值与位掩码进行比较。
if (var & 0x08) {
/* The fourth bit is set */
}
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding