虽然位运算在实际开发中并不经常使用,可是在各类算法中却经常见到它们的身影.由于是直接操做二进制的,因此机器执行起来就快不少,因此尽管实际业务中不经常使用,但若是你不想只作个码农,这个基础仍是要掌握的;算法
讲位操做以前,就必需要知道原码、反码、补码
spa
其中正数的
原码=反码=补码
在机器的内存中,一个负数的表示是
这个负数的绝对值取原码,再取反码,再加一
,最后出现的就是这个负数在内存中的表示的二进制数值
好比说-9在内存中的二进制码,这里用8位表示:code
最后-9在内存中的二进制值为11110111
blog
在二进制中,最高位为符号位,
0表明正,1表明负
在Java
中的int
类型有4字节
,一个字节有8位
,因此这边用32位表示一个数内存
这边负数表示是在内存中表示的二进制值
右移时:最高位
补符号位1
开发左移时:末尾补0rem
右移时:最高位补符号位0
左移时:末尾补0it
不管是正数仍是负数,右移
最高位一概补0
当相对应的位都为1时,等于1,不然等于0
为了方便表示,接下来所有都用8位表示一个数table
当相对应的位有一个为1时,等于1,不然等于0
当相对应的位不一样时,等于1,相同时等于0
1等于0,0等于1
含义 | 运算符 | 说明 |
---|---|---|
左移 | << | 末尾补0 |
右移 | >> | 负数:最高位补符号位1 正数:最高位补符号位0 |
无符号右移 | >>> | 不管是正数仍是负数,右移最高位一概补0 |
&(位与) | & | 当相对应的位都为1时,等于1,不然等于0 |
丨(位或) | 丨 | 当相对应的位有一个为1时,等于1,不然等于0 |
^(异或) | ^ | 当相对应的位 不一样时,等于1 相同时,等于0 |
~(取反) | ~ | 1等于0,0等于1 |