c++ 二进制总结


C/C++ 默认数字使用十进制,八进制使用前缀 0, 十六进制使用前缀 0x 或 0X

加法

010+010为例:加法两边的数值的右边第一位都是0,相加得0;中间那一位都是1,相加为2,所以需要进位,结果变为0;左边第一位都是0,相加得0,再加上进的为,结果为1。按照加法运算结果应该为1000,因为位数已经固定为3位,所以最左边超出的一位将被舍弃,结果为000

c++中二进制的运算有一个前提条件,必须固定位数再进行运算,如果进位时超出位数,那么超出部分将会舍弃。例如需要相加的二进制数值为3位数,110+010,按照加法运算的结果应该为1000,因为位数已经固定为三维,左边超出的一位将被舍弃,所以结果为000

unsigned int是保存非负整数的int类型,它的最大值是4294967295,也就是二进制32位都是1的值,而且unsigned int是用固定的32位二进制来保存数据的,所以当它加上1的时候,就会因为进位而超出一个位,而超出的这个位就会被舍弃,因此输出结果就是0。

减法

从低位开始减,方法同加法

<< 左移运算和 >>右移运算

以二进制0110举例:0110左移一位就是在右边添加1位0,得出01100,由于固定位数,所以左边超出的1位被舍弃,结果就是11000110左移两位就是在右边添加2位0,得出011000,由于固定位数,所以左边超出的2位被舍弃,结果就是1000,以此类推。右移也是同理,0110右移1位就是0011,右移2位就是0001

在C++中左移的运算符号是<<,右移的运算符号是>>。0110左移2位的代码就是0110 << 2,0110右移2位的代码就是0110 >> 2。

例如0001 + 0001的结果是0010,0010 + 0010的结果是0100,0011 +0011的结果是0110。可以看出:一个数乘以2就等于这个数左移一位,而一个数左移两位就是这个数乘以2的2次方,以此类推。而右移也是同理。对一个数右移一位作用等同于除2取整

对于二分查找:int mid = (left + right) >> 1;

&与运算

如果两个位均为 1,则对应的结果位将设置为 1。 否则,将对应的结果位设置为 0。

例如 1 & 1的结果是1;1 & 0或者0 & 1的结果是0,0 & 0的结果也是0。

而二进制运算0110 & 0100的结果是0100。可以看出与运算就是二进制各个位上对应的数进行与运算,都是1的时候结果是1,有一个0或者都是0的时候结果是0。

判断奇偶性:

当 num 是偶数时,num & 1 =0;

当 num 是奇数时,num & 1 = 1。

  • n & 1 可以获取整数n的最低二进制位

| 或运算

1 | 1的结果是1;1 | 0或者0 | 1的结果是1,0 | 0的结果也是0。

而二进制运算0110 | 0100的结果是0110。可以看出或运算就是二进制各个位上对应的数进行或运算,都是1或者有一个是1的时候结果是1,都是0的时候结果是0。

^ 异或运算

1 ^ 1的结果是0;1 ^ 0或者0 ^ 1的结果是1,0 ^ 0的结果也是0。也就是说,异或相同的数结果是0,异或不同的数结果是1,而二进制运算0110 ^ 0100的结果是0010

~取反运算

取反运算就是二进制各个位上的数,0变为1,1变为0。例如二进制运算~0110的结果是1001

取反运算时,需要注意它的数据类型,不同的数据类型的位数都不相同,而上面也说过左边多出来的0可以省略,所以就算是同一个数,如0b1101,二进制位数是4位时结果是0b0010,二进制位数是8位时结果是0b11110010,它们的值是不一样的。所以,取反必须要注意它的数据类型哟~。

c++ 常用变量位数

  • int
    位数:32
    最小值:-2147483648
    最大值:2147483647
  • unsigned int
    位数:32
    最小值:0
    最大值:4294967295
  • long
    位数:32
    最小值:-2147483648
    最大值:2147483647
  • float
    位数:32
    最小值:1.17549e-38
    最大值:3.40282e+38
  • double
    位数:64
    最小值:2.22507e-308
    最大值:1.79769e+308
  • size_t
    位数:64
    最小值:0
    最大值:18446744073709551615
  • string
    位数:256

参考

https://blog.csdn.net/xiaoguyin_/article/details/79777836
https://blog.csdn.net/mars_xiaolei/article/details/100536467

猜你喜欢

转载自blog.csdn.net/weixin_45626706/article/details/127751088