计算机中的所有数据均以二进制表示,即0或1。计算机不理解我们的语言,它们理解位。通常,程序员并不关心位级别的操作。但是有时程序员必须更深入地研究并研究比特。
位表示
在编程中,将n位整数存储
为由n位组成的二进制数。因此,一个32位整数由32位组成,而64位
整数由64位组成。在C ++编程语言中,int数据类型
为16位,32位和64位类型。
这是32位整数数字10的位表示形式:
0000000000000000000000000000101010
在C ++中,
int
是带符号的或无符号的,因此位表示形式是带符号的或无符号的。
在带符号的表示中,第一位表示数字的符号(0
表示正,1表示负),其余n-1位包含数字的
大小。
有符号和无符号表示之间存在联系。签名号码
-x
等于一个无符号数
2^n – x
。
-x (signed) = 2^n - x (unsigned)
inta =-10;unsignedintb = a;std::cout<< a <
在签名表示中,下一个数字
2^(n – 1) – 1
是
-2^n – 1
,并且以无符号表示形式,是下一个数字
2^n – 1
是
0
。
位操作
我们可以使用&运算符检查数字是偶数还是奇数。
unsigned int的二进制表示形式:
void binary(unsignedintnum){for(inti =256; i >0; i = i/2) {if(num & i)std::cout<
将位设置在位置:
int set_bit(intnum,intposition){intmask =1<< position;returnnum | mask;}
获取位的位置:
boolget_bit(intnum,intposition){boolbit = num & (1<< position);returnbit;}
在清零位置:
int clear_bit(intnum,intposition){int mask =1<< position;returnnum & ~mask;}
代表集
整数的位表示为0索引,并且索引从右侧(即最低有效位)开始。这样我们就可以代表集合的每个子集
{0, 1, 2, ..., n-1}
作为n位整数,其位指示哪个元素属于该子集。如果在数字的二进制表示中索引3的位为1,索引4的位为0,则3属于该子集,而4不属于该子集。
对于32位整数,集合为{0,1,2,…,31},子集为{1、3、4、8}。该集合的二进制表示形式是:
00000000000000000000000100011010
,十进制表示形式是2 ^ 8 + 2 ^ 4 + 2 ^ 3 + 2 ^ 1 = 282。
代码形成子集并向其中添加元素:
int add_elements_to_subset(){intsubset =0;subset = subset | (1<<1);subset = subset | (1<<3);subset = subset | (1<<4);subset = subset | (1<<8);returnsubset;}
打印子集元素的代码:
void printing_subset(intsubset){for(inti =0; i <32; i++){if(subset & (1<< i))std::cout<< i <