std::bitset
输出二进制内容
引用头文件<bitset>
语法:
std::bitset<要显示的二进制位数>(要显示的变量);
#include<bitset>
int a {0b10101010111110111111111111111};
std::cout<<std::bitset<12>(a)
结果为
111111111111
左移和右移
int a {0b11111111};
a<<=4;
std::cout<<std::bitset<8>(a);
a>>=4;
std::cout<<std::bitset<8>(a);
结果为11110000
结果为00001111
知识扩展*:左移n位,就是乘以2^n,右移n位,就是除以2的n次方
第5行a输出结果可能为00001111,也可能为11111111,因为a是个负数,正数前面补0,负数前面补1
负数的表示
负数都以补码的形式存在
原码
一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101是5的原码。
反码
将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
比如称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,即后者也是前者的反码。
补码
反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
补码在计算器里面算出的结果都为一个比较大的数,而在计算机里面却表示一个负数,这就是它们的区别。
求反运算~
与运算 &
有0为0,两1为1
作用:一般用来保留高位
例:
0x2833,想要保留0x28,可以将0x2833&0xff00
或运算|
有1为1,两0为0
作用:一般升级到最大值
例
0x2833,想要将最高的两位调到FF,可以将0x2833|0xFF00
位运算之异或
a^b=c
c^a=b
b^c=a
a
/ \
b----------c
这三者呈三角形关系
0^0=0
1^0=1
1^1=0
并且有A^0=A A^A=0
并且B^A^A=B 因为B^A^A=B^(A^A)=B^0=B
然后可以利用他来交换AB的值 只要这样
A^=B
B^=A
A^=B
具体算法可以参照
知识扩展*:*if(a^b)
因为如果a^b要为1,那就要满足a为1并且b为0,或者a为0,b为1
写成公式就是下面的,所以如果遇到下面的条件,可以直接写成a^b
if((a==true&&b==false)||(a==false&&b==true))
if((a==true||b==true)&&!(a==true&&b==true))