目录
一、概述
二、位移运算 >> << >>>
①. >>:将一个数右移 最高位是0,则左边补齐0;如果最高位为1,则左边补齐1
②. <<:将一个数左移 左边最高位直接丢弃,右侧补齐0
③. >>>:无符号右移,直接左侧补齐0,不管最高位是0或者1
三、位运算 & | ^ ~
①. &:按位 于 运算,将相同位置的二进制进行 与 运算:如果有0则结果为0,如果都为1,则结果为1
②. |:按位 或 运算,将相同位置的二进制进行 或 运算:如果有1则结果为1,如果都为0则结果为0
③. ^:按位 异或 运算,将相同位置的二进制进行 异或 运算:如果相同则结果为0,如果不同则结果为1
④. ~:按位 取反 运算, 二进制进行 取反运算:将1变为0,0变为1,进行取反操作
一、概述
二进制包含有: 原码、反码、补码,且正数的原码、反码、补码一样;
原码:直接计算得到的二进制码
反码:对二进制码取反,如:二进制码为 0001010 则反码为 1110101 最高位为符号位,不变
补码:对二进制反码 加一,如反码为 1110101 则补码为:1110110
根据补码得原码,过程与通过原码得补码相反。
二进制的操作,都对补码进行操作,而我们算出来的都是原码,所以需要先转换为补码,再运算,运算完成再转回原码(正数不需要转换,因为三个码一样)
二、位移运算 >> << >>>
①. >>:将一个数右移 最高位是0,则左边补齐0;如果最高位为1,则左边补齐1
如9>>2:转换二进制:00000000 00000000 00000000 00001001
右移2:00000000 00000000 00000000 00000010 丢掉了最右边的两位-01,左边补0
结果是:2
如-9>>2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
反码:11111111 11111111 11111111 11110110
补码:11111111 11111111 11111111 11110111
对补码右移2:11111111 11111111 11111111 11111101 丢掉了最右边的两位-11,左边补1(因为负数,最高位为1)
反码:11111111 11111111 11111111 11111100
源码:10000000 00000000 00000000 00000011
结果是:-3
②. <<:将一个数左移 左边最高位直接丢弃,右侧补齐0
如9<<2:转换二进制:00000000 00000000 00000000 00001001
左移2:00000000 00000000 00000000 00100100 丢掉了最左边的两位-00,右边边补0
结果是:36
如-9<<2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
反码:11111111 11111111 11111111 11110110
补码:11111111 11111111 11111111 11110111
对补码左移2:11111111 11111111 11111111 11011100 丢掉了最左边的两位-11,右边边补0
反码:11111111 11111111 11111111 11011011
源码:10000000 00000000 00000000 00100100
结果是:-36
③. >>>:无符号右移,直接左侧补齐0,不管最高位是0或者1
如9>>>2:转换二进制:00000000 00000000 00000000 00001001
右移2:00000000 00000000 00000000 00000010 丢掉了最右边的两位-01,右边边补0
结果是:2
如-9>>>2:转换二进制:10000000 00000000 00000000 00001001(因为负数,需要取补码)
反码:11111111 11111111 11111111 11110110
补码:11111111 11111111 11111111 11110111
对补码右移2:00111111 11111111 11111111 11111101(因为已经是正数,补码、反码、源码一致)
结果是:1073741821
三、位运算 & | ^ ~
①. &:按位 于 运算,将相同位置的二进制进行 与 运算:如果有0则结果为0,如果都为1,则结果为1
如9 & 10:转换二进制:00000000 00000000 00000000 00001001
&
00000000 00000000 00000000 00001010
=
00000000 00000000 00000000 00001000
最终结果为 8
②. |:按位 或 运算,将相同位置的二进制进行 或 运算:如果有1则结果为1,如果都为0则结果为0
如9 | 10:转换二进制:00000000 00000000 00000000 00001001
|
00000000 00000000 00000000 00001010
=
00000000 00000000 00000000 00001011
最终结果为 11
③. ^:按位 异或 运算,将相同位置的二进制进行 异或 运算:如果相同则结果为0,如果不同则结果为1
如9 ^ 10:转换二进制:00000000 00000000 00000000 00001001
^
00000000 00000000 00000000 00001010
=
00000000 00000000 00000000 00000011
最终结果为 3
④. ~:按位 取反 运算, 二进制进行 取反运算:将1变为0,0变为1,进行取反操作
如 ~9:转换二进制 00000000 00000000 00000000 00001001
=
11111111 11111111 11111111 11110110
得到结果是补码,因为最高位为1是负数,所以需要取反码:
11111111 11111111 11111111 11110101
然后根据反码取得原码:
10000000 00000000 00000000 00001010
最终结果为-10