关于二进制存储以及位运算符的一些Tips

二进制存储

数字在计算机当中是以二进制的形式来进行存储的。

比如说,我们都知道,int型的取值范围为-2147483648到+2147483647,即 -231~(231-1),为什么呢?这是因为,计算机中规定int型的存储空间为4个字节,也就是32位,考虑到数字有正负之分,所以取最高位作为符号位,0表示正数,1表示负数,剩下31位为数值位。
而正数和负数在数值位上的表示也有不同。

  • 正数在计算机中是以原码的形式存储的,即最小正整数为1(0-000 0000 0000 0000 0000 0000 0000 0001);最大正整数为2147483647(0-111 1111 1111 1111 1111 1111 1111)
  • 负数在计算机中是以补码(原码按位取反加一)的形式存储的,-1在计算机中表示为1-111 1111 1111 1111 1111 1111 1111 1111,-2147483647在计算机中表示为1-000 0000 0000 0000 0000 0000 0000 0001。
  • 所以最小负数就是-2147483647吗?不是,因为0这个特殊的存在,它的原码和补码在数值位上都是0000000000000000000000000000000,所以0只需要一种存储形式就可以了,把-0拿来当做一个最小的数-2147483648,在32位没有原码,但这并不是-2147483648真正的补码,它真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,需要33位来表示,是溢出的。
    综上所述,带符号32位int类型整数为-2147483648~2147483647

位运算符

基于二进制存储,计算机中是通过位运算符进行计算的。
关于二进制存储以及位运算符的一些Tips_第1张图片
比如说:

  • n&1就相当于n%2,用来判断奇偶性,如果是奇数则返回1,如果是偶数则返回0;
  • n>>=1就相当于n/=2,不断地去掉最后一位,比如10二进制表示为1010,去掉最后一位则为0101(=5);
    同理,那n<<=1就相当于n*=2

你可能感兴趣的:(算法)