c++语言包括许多基本数据类型,可用于表示字符和整数数据。
数据类型 | 比特大小 |
---|---|
字符 | 8 |
短 | 16 |
int | 32 |
很久很久 | 64 |
赢博体育这些数据类型都是有符号类型,这意味着它们的第一个位被保留为符号位。如果表示的数字是负数,则第一个位将为1,否则符号位将为0。
在我们只想表示正整数的情况下,我们可以使用这些基本类型的无符号变体。无符号的变体没有符号位,并使赢博体育的位可用来存储数值数据。
在大多数需要处理数值数据的赢博体育程序中,我们都希望使用十进制数字表示。c++自动将十进制数转换为二进制数。
Int x = 357;//将十进制357转换为二进制并存储在x中
在我们明确想要处理位序列的情况下,我们会发现使用一种更容易写出我们想要的位序列的数字系统是很有用的。c++提供了另一种表示数字数量的方案,该方案使用16进制或十六进制数字系统。
下面是16进制的数字及其相应的位序列。
数字 | 一些等价 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
一个 | 1010 |
B | 1011 |
C | 1100 |
D | 1101 |
E | 1110 |
F | 1111 |
由于十六进制数中的每个数字恰好占4位,并且位中赢博体育整数类型的大小都是8的倍数,因此该数字系统使表示位序列的系统易于使用。要把一个无符号字符写成8位,我们只需要写出两个十六进制数字。
为了在c++中编写十六进制数,我们在数字前面加上0x,以表明该数字是十六进制数。
下面是一些使用十六进制数在变量中存储特定位序列的代码位示例。
Unsigned char 0 = 0x00;// 00000000 unsigned char 1 = 0x01;// 00000001 unsigned char allOnes = 0xFF;// 11111111 unsigned char zebra = 0x55;/ / 01010101
c++语言不包含允许我们表示单个位的数据类型。相反,我们必须处理一组位。该语言允许使用的最小位组是unsigned char,它是一组8位。
c++确实包含了允许我们操作数字中的位的操作符。这些位运算符并行地处理一组位。
三个位操作符分别是位操作符&、位操作符|和位排他操作符^。下面的表格显示了这些运算符是如何作用于比特对的。
& | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
| | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
^ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
当这些运算符赢博体育于整数对时,它们并行地作用于构成整数的赢博体育位。这里有一些示例来演示它是如何工作的。
unsigned char = 0x5F;// unsigned char b = 0x6A;// 11001010 unsigned char c = a & b;// 10001010 unsigned char d = a | b;// 11011111 unsigned char = a ^ b;/ / 01010101
位运算符通常用于对数字执行位操作。例如,要确定一个数字中的给定位是否为1,我们可以用一个特殊构造的掩码在该位置上有一个1:
Unsigned char mask = 0x08;// 00001000 unsigned char x = 85;Unsigned char bit = x & mask;// bit将是00000000或00001000取决于// x的第3位是什么。Unsigned char mask = 1;// 00000001 unsigned char x = 85;unsigned char lastBit = x & mask;//提取x的最后一位unsigned char mask = 0x80;// 10000000 unsigned char x = 85;unsigned char firstBit = x & mask;//提取x的第一位
我们可以使用按位或运算符将数字中的特定位设置为1。
Unsigned char mask = 1;// 00000001 unsigned char x = 86;X = X | mask;//设置x的最后一位为1
可以使用and操作符和反掩码的组合将数字中的任意位设置为0。
unsigned char mask = 0x7F;// 01111111 unsigned char x = 85;X = X & mask;//设置x的第一位为0
排他或操作符最常用于将位翻转到相反的状态。这是基于这样的观察,即任何位与1的互斥或产生与该位相反的结果。
unsigned char mask = 0xFF;// 11111111 unsigned char x = 85;X = X ^ mask;// x中的赢博体育位都被翻转到//它们的相反值。
c++为进行位操作提供的最后两个操作符是位移位操作符< <和> >。这些运算符将位序列向左或向右移动若干个空格,用0位填充,并去掉从数字上掉下来的任何位。这里有一些例子。 和>
unsigned char x = 0xD5;// 11100101 x = x << 2;// x现在是10010100 x = x >> 3;// x现在是00010010
位移位操作符通常与掩码操作结合使用,一个一个地从数字中剥离位。下面的例子展示了如何将一个unsigned char分割成一个单独的位数组:
unsigned char x = 0xD5;无符号char位[8];Unsigned char mask = 1;// 00000001 for(int n = 7;n >= 0;n——){bits[n] = x & mask;//如果x的最后一位为1,则为1,如果不是,则为0 x = x >> 1;//使用shift去掉x的最后一位}