进制学习这一篇就够了( 二 )


1101…. = (-1) * 231 + 1 * 230 + 0 * 229 +1 * 228+….
0101…. = 0 * 231 + 1 * 230 + 0 * 229 +1 * 228+….
原码、反码、补码原码:是最简单的机器数表示法 。用最高位表示符号位 , ‘1’表示负号 , ‘0’表示正号 。其他位存放该数的二进制的绝对值 。(最高位是符号位 , 0表示正数 , 1表示负数) 。
反码:正数的反码还是等于原码 。负数的反码就是他的原码除符号位外 , 按位取反 。
补码:正数的补码是其本身 , 负数的补码是在其反码的基础上+1 。(计算机中 , 数值一律用补码表示和存储的)
小结:正数的原码、反码、补码一样 。负数的反码是原码除符号位取反 , 补码是反码+1
示例:


-2
2
原码
1000 0000 0000 0010
0000 0000 0000 0010
反码(负数符号位不变 , 其他取反)
1111 1111 1111 1101
0000 0000 0000 0010
补码(负数是反码+1)
1111 1111 1111 1110
0000 0000 0000 0010
备注:其实2是int型 , 在java中是以4个字节 , 32位存在的 。
二进制位运算计算机计算和存值都是补码 , 正数补码是原码 。负数补码是原码取反+1 。
最高位是符号位:0表示正 , 1表示负
位运算符有:与 & 、 或| 、异或^、取反~ 、左移位<< 、
数学右移位(有符号右移)>> 、逻辑右移位(无符号右移)>>>
1.1与运算:&
与运算的操作符为& 。两者为1才为1 , 否则为0 。即:1&1=1;1&0=0;0&0=0.
比如计算15&10 , 首先15的二进制为:1111 , 10的二进制为1010 , 所以15&10为:

进制学习这一篇就够了

文章插图
所以15&10=10 。
1.2或运算:|
或运算的操作符为| 。一个为1则为1 , 两者为0则为0 。即:1|1=1;1|0=1;0|0=0.
比如计算15&10 , 首先15的二进制为:1111 , 10的二进制为1010 , 所以15|10为:
进制学习这一篇就够了

文章插图
所以15|10=15 。

1.3 取反运算:~
取反运算的操作符为~ , 取反 。即:~1=0;~0=1.
比如计算~10 , 首先10的二进制为:1010 , ~10为:
进制学习这一篇就够了

文章插图
~10=5 。
1.4 异或运算:^
异或运算的操作符为^ 。相同为0 , 不同为1 。即:1^1=0;1^0=1;0^0=0.
比如计算15^10 , 首先15的二进制为:1111 , 10的二进制为1010 , 所以15^10为:
进制学习这一篇就够了

文章插图
所以15^10=5 。
  • 左移:<<
左移就是将二进制的所有的数字向左移动对应的位数 , 高位舍去 , 低位补零
左移将原数乘以2的n次方 。
100 << 2
二进制补码:00000000 00000000 00000001 100100
二进制左移2位: 00 | 00000000 00000000 00000001 100100 00
解释: | 前面被剔除 , 后面缺少的两个补0
结果:左移两位相当于乘以22 ,  结果为100 << 2= 100 * 22 = 400
  • 右移:>>
右移就是将二进制的所有的数字向右移动对应的位数 , 低位舍去 , 高位补符号位 。即正数补0 , 负数补1
右移将原数除以2的n次方 。
100 >> 2
二进制补码: 00000000 00000000 00000000 01100100
二进制右移2位: 00000000 00000000 00000000 00011001 | 00
解释: | 后面被剔除 , 前面缺少的两个补0 , 符号位是0则补0
结果: 右移两位相当于除以2 , 再除以2 , 结果为100 >> 2= 100 / 22 = 25
  • 无符号右移:>>>
无符号右移就是将二进制的所有的数字向右移动对应的位数 , 低位舍去 , 高位补零 。
-10 >>> 1
二进制补码: 11111111 11111111 11111111 11110110
二进制无符号向右移1位: 0 1111111 11111111 11111111 11111011 | 0
结果:负数进行无符号右移会变为正数 。
二进制位运算运用2.1任何一个数和0异或是它的本身 , 和自身异或为0 。
a^0=a ; a^a=0
利用上述性质 , 可以用来计算2个数的交换 。
大家应该知道 , 在计算机里 , 两个数互相交换 , 需要定义一个中间的变量来参与交换 。如: