您如何设置,清除和切换? html
使用此处定义的运算符之一。 ios
要设置一点,请使用int x = x | 0x?;
int x = x | 0x?;
在?
是二进制形式的位位置。 数组
对于初学者,我想用一个例子来解释一下: 测试
例: ui
value is 0x55; bitnum : 3rd.
使用&
运算符检查该位: spa
0101 0101 & 0000 1000 ___________ 0000 0000 (mean 0: False). It will work fine if the third bit is 1 (then the answer will be True)
切换或翻转: 调试
0101 0101 ^ 0000 1000 ___________ 0101 1101 (Flip the third bit without affecting other bits)
|
操做员:设置位 code
0101 0101 | 0000 1000 ___________ 0101 1101 (set the third bit without affecting other bits)
由于这被标记为“嵌入式”,因此我假设您正在使用微控制器。 以上全部建议都是有效且可行的(读-修改-写,联合,结构等)。 htm
可是,在基于示波器的调试中,我惊讶地发现与直接将值写入微控制器的PORTnSET / PORTnCLEAR寄存器相比,这些方法在CPU周期上具备至关大的开销,这在存在紧密循环/高电平的状况下确实有所不一样频率ISR的切换引脚。 索引
对于那些不熟悉的人:在个人示例中,微控制器具备反映输出引脚的通用引脚状态寄存器PORTn,所以执行PORTn | = BIT_TO_SET会致使对该寄存器进行读-修改-写操做。 可是,PORTnSET / PORTnCLEAR寄存器为1表示“请将该位设为1”(SET)或“请将该位设为0”(CLEAR),为0则表示“请单独保留该引脚”。 因此,你最终有两个端口地址取决因而否你设置或清除该位(并不老是很方便),但更快的反应和更小的汇编代码。
Visual C 2010,也许还有许多其余编译器,都直接支持内置的位操做。使人惊讶的是,这有效,即便sizeof()
运算符也能够正常工做。
bool IsGph[256], IsNotGph[256]; // Initialize boolean array to detect printable characters for(i=0; i<sizeof(IsGph); i++) { IsGph[i] = isgraph((unsigned char)i); }
所以,对于您的问题, IsGph[i] =1
或IsGph[i] =0
使设置和清除布尔值变得容易。
查找不可打印的字符:
// Initialize boolean array to detect UN-printable characters, // then call function to toggle required bits true, while initializing a 2nd // boolean array as the complement of the 1st. for(i=0; i<sizeof(IsGph); i++) { if(IsGph[i]) { IsNotGph[i] = 0; } else { IsNotGph[i] = 1; } }
请注意,此代码没有什么“特殊的”。 它对待就像一个整数-从技术上来讲,它是。 一个1位整数,能够容纳2个值,而且只能包含2个值。
我曾经使用这种方法来查找重复的贷方记录,其中贷方编号是ISAM密钥,使用6位数的贷方编号做为位数组的索引。 通过8个月的快速测试,证实了咱们从中获取数据的大型机系统实际上发生了故障。 位数组的简单性使其对正确性的置信度很高-例如,与搜索方法相比。
扩展bitset
答案:
#include <iostream> #include <bitset> #include <string> using namespace std; int main() { bitset<8> byte(std::string("10010011"); // Set Bit byte.set(3); // 10010111 // Clear Bit byte.reset(2); // 10010101 // Toggle Bit byte.flip(7); // 00010101 cout << byte << endl; return 0; }