如何设置,清除和切换单个位?

您如何设置,清除和切换? html


#1楼

使用此处定义的运算符之一。 ios

要设置一点,请使用int x = x | 0x?; int x = x | 0x?;? 是二进制形式的位位置。 数组


#2楼

对于初学者,我想用一个例子来解释一下: 测试

例: 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)

#3楼

由于这被标记为“嵌入式”,因此我假设您正在使用微控制器。 以上全部建议都是有效且可行的(读-修改-写,联合,结构等)。 htm

可是,在基于示波器的调试中,我惊讶地发现与直接将值写入微控制器的PORTnSET / PORTnCLEAR寄存器相比,这些方法在CPU周期上具备至关大的开销,这在存在紧密循环/高电平的状况下确实有所不一样频率ISR的切换引脚。 索引

对于那些不熟悉的人:在个人示例中,微控制器具备反映输出引脚的通用引脚状态寄存器PORTn,所以执行PORTn | = BIT_TO_SET会致使对该寄存器进行读-修改-写操做。 可是,PORTnSET / PORTnCLEAR寄存器为1表示“请将该位设为1”(SET)或“请将该位设为0”(CLEAR),为0则表示“请单独保留该引脚”。 因此,你最终有两个端口地址取决因而否你设置或清除该位(并不老是很方便),但更快的反应和更小的汇编代码。


#4楼

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] =1IsGph[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个月的快速测试,证实了咱们从中获取数据的大型机系统实际上发生了故障。 位数组的简单性使其对正确性的置信度很高-例如,与搜索方法相比。


#5楼

扩展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;
}
相关文章
相关标签/搜索