Java中位操作:

一.位与字节的概念

bit (位) bit 电脑记忆体中最小的单位,在二进位电脑系统中,每一 bit 可以代表 0 或 1 的数位讯号。所以它能表示的数字范围就是 0或是1


byte (字节) 一个 byte 由 8 bit 组成,所以理论上一个 byte 能表示的数据范围是 0 ~ 255



二.java中基础数据类型的储存长度


short:2 个字节。


int:4 个字节。


long:8 个字节。


byte:1 个字节。


float:4 个字节。


double:8 个字节。


char:2 个字节。


boolean:boolean属于布尔类型,在存储的时候不使用字节,仅仅使用 1 位来存储,范围仅仅为0和1,其字面量为true和false。



三.位操作


1.& 与运算符


    规则 与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.


    0 & 0 = 0,


    0 & 1 = 0,


    1 & 1 = 1



示例:3 & 5 = 1 这是因为


0000 0011


&


0000 0101


=


0000 0001


 


按照规则,将两个数值按照低位到高位一一对齐运算,因为只有第 0 位都为 1,所以计算结果为 1.



2. | 或运算符


    规则 与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0


0 | 0 = 0,


0 | 1 = 1,


1 | 1 = 1



示例:3 | 5 = 7 这是因为


0000 0011


|


0000 0101


=


0000 0111



3.~ 取反运算符


    规则 对操作数的每一位进行操作,1 变成 0,0 变成 1


~5 =>  0000 0101   ~  => 1111 1010



4.^ 异或运算符


规则 两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。


1 ^ 0 = 1,


1 ^ 1 = 0,


0 ^ 0 = 0;



示例:3 ^ 5 = 6,这是因为


0000 0011


^


0000 0101


=


0000 0110


针对这个特性,我们可以将异或运算作为一个简单的数据加密的形式。比如,将一个mp4文件所有数值与一个种子数值进行异或得到加密后的数据,解密的时候再将数据与种子数值进行异或一次就可以了


所以说异或运算可以作为简单的加解密运算算法



5.>> 右移运算符


规则 a >> b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0。


5 >> 1 ===>  1000 0000 0000 0101 >> 1  = 1000 0000 0000 0010 = 2


7 >> 2 ===>  1000 0000 0000 0111 >> 2  = 1000 0000 0000 0001 = 1


9 >> 3 ===>  1000 0000 0000 1001 >> 3  = 1000 0000 0000 0001 = 1


11 >> 2 ===> 1000 0000 0000 1011 >> 2 = 1000 0000 0000 0010 = 2


大家发现什么规律没有?a >> b = a / ( 2 ^ b ) ,所以 5 >> 1= 5 / 2 = 2,11 >> 2 = 11 / 4 = 2



6.<< 左移运算符


规则 a << b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0


5 << 1 ===>  1000 0000 0000 0101 << 1  = 1000 0000 0000 1010 = 10


7 << 2 ===>  1000 0000 0000 0111 << 2  = 1000 0000 0001 1100 = 28


9 << 3 ===>  1000 0000 0000 1001 << 3  = 1000 0000 0100 1000 = 72


11 << 2 ===> 1000 0000 0000 1011 << 2 = 1000 0000 0010 1100 = 44


很明显就可以看出 a << b = a * (2 ^ b)


综合上面两个可以看到,如果某个数值右移 n 位,就相当于拿这个数值去除以 2 的 n 次幂。如果某个数值左移 n 位,就相当于这个数值乘以 2 ^ n