在C++中访问char类型变量的单个位

23

我应该如何访问C++类型(例如char或其他类型)中的单个比特位?


可能是如何在C语言中设置、清除和切换单个位?的重复问题。 - PlasmaHH
理论上不是重复的(C vs C ++),但足够相似以关闭此问题。 - MSalters
是的,我确实看到了C版本,但我想知道如何在C++中实现这个,因为我觉得它们是相同的,所以你可以关闭它。 - AnotherProgrammer
4个回答

69
如果您想要访问位 N
获取:(INPUT >> N) & 1; 设置:INPUT |= 1 << N; 清除:INPUT &= ~(1 << N); 切换:INPUT ^= 1 << N;

13
应强调位 N 的含义。在这种情况下,我们将 bit 0 视为最右边和最不重要的位。还有其他符号表示方法,它们做法不同。 - Carsten Greiner
@CarstenGreiner,一般来说,在编程中我们可以假设任何东西都是以零为基础的。这是大多数集合遵守的标准。 - Matt
@Mat:我经常与硬件及其对应的寄存器定义打交道。你可以看到,寄存器被定义为从0到63 - 其中0是最左边的位。我也看到寄存器被定义为从63到0。关于集合,元素0是第一个 - 我不反对。 - Carsten Greiner
@CarstenGreiner,当我说“开始”时,可能应该更清楚一些。我的意思是最右边的位,或者说最低有效位是零。这是我一直认为对于大多数常见应用程序而言都是一致的定义。不过,调整代码以适应N的另一种定义应该很容易。 - Matt
有人能解释一下上面的Toggle是如何工作的吗?我理解N是我们要定位的位,1 << N将1的位向左移动N次,将1放置在第N个位置。 - Arif Ali Shaik
@aash20 - ^= 是异或 (XOR) 运算符,如果仅有其中一个输入位被设置,则设置该位。请查看 维基百科 获取真值表。 - Matt

7
您需要使用二进制运算符|(或)、&(与)和^(异或)来设置它们。例如,要设置变量a的第三位,您可以输入以下内容:
a = a | 0x4

// c++ 14
a = a | 0b0100

请注意,4的二进制表示为0100。

1

这非常简单。 假设您需要访问整数的各个位。 创建一个掩码,如下所示: int mask =1; 现在,将您的数字与此掩码进行与操作,即可获得零位设置的值。 为了访问在第i个位置设置的位(索引从零开始),只需使用(mask<)进行与操作。


1
如果您想查看数字中的第n位,可以使用:number&(1<<n)。实际上,(1<<n)基本上是2^n(因为您将1位左移...0001 n次,每次左移都意味着乘以2)创建了一个数字,该数字在除了第n个位置以外的所有位置都是0(这就是数学的工作原理)。然后,您将其与number &在一起。这返回一个数字,它在任何地方都是0,或者具有某个位置上的1(实质上是一个整数,要么为0,要么不为0)。例如:4中的第二位,4&(1<<2)
  0100
& 0010
  ____
  0000 = 0

因此,4中的第2位是0。
因为在C、C++中,字符也是数字,所以这也适用于字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接