位运算和位运算符(原码,反码,补码)

发布于 2020-05-15  459 次阅读


计算机在执行计算时会把数值转化成二进制的形式,位运算就是就是计算机的底层二进制的计算方式,位运算符就是计算符号

8421进制转化法:

8421法(二进制与十进制的快速转化)是bcd码中的一个分支,bcd码就是把二进制的位数,与2的n次方一一对应,8421法把二进制的位数对应的2的n次方相加,就可以得到二进制对应的十进制数

二进制:            1       1         1       1       1         1          1        1       1

2的次方:    256      128     64       32       16      8       4       2       1 

二进制的1分别在具体数字中的位置,对应2的次方的值,

如:二进制1010:在8421法中0没有实际意义这是一个位置,1010这个1对应2的1次方,1010对应2的3次方,所有2的1次方加上2的3的次方等于10,所有1010的十进制数就是10

java中数值型的底层表示:

在java中不同类型对应的字节数不同,一个字节等于8bit:

               类型               字节数                   位数                        

                int    b              4                           32

                long                8                              64

                byte                1                               8

               float                 4                              32

              char                  2                               16

              double             8                               64

              boolean           1                                8

所有在java中数值的表示,必须补足位数

如:   十进制:7   ->  二进制:111 -> java int类型表示:00000000000000000000000000000111(这是有符号数,符号位+数值位)

有符号数与无符号数:

在计算机存储数值都是数值的二进制存放,但二进制数值也分为有符号数与无符号数,主要是为了区分正负数

有符号数:符号位+数值位,数的最高位是符号位其他位数值位,符号位只有0和1,0表示正数,1表示负数,如0

10000000000000000000000000000111        -7

0000000000000000000000000000111          7

注:符号位没有实际意义,只是标识

无符号数:没有符号位,所有都表示正数(0),如图片,音频数据

原码,反码,补码:

正数的原码,反码,补码相同

负数的原码,反码,补码有转化过程:

                          原码:数值的二进制数 

                          反码:原码与补码转化的中间桥梁,原码的除符号位取反

                          补码:反码加1,计算机都是以补码形式计算存储的

一般人看原码,计算机看补码

例子:

http://wql.luoqin.ltd/wp-content/uploads/2020/05/补码.png

位运算符:

位算符的操作数是数值型,逻辑运算符是Boolean(虽然它也是0和1的变种)

位运算符按操作数的多少分为:

1,单目运算符:对一个值的操作(~,>>,<<,>>>)

2,双目运算符:对两个值的操作(&,|,^)

&:按位与

|:按位或

^:按位异或

~:按位取反(符号位也取反)

>>:按位右移

<<:按位左移

>>>:无符号右移(空白部分用零填,>>和<<空白部分用符号位填)

&符:都为1才取1,不同则为o,都为0也为0(相当于逻辑运算符的&&与)

例:2&3:在底层传化成二进制码按位比较

000000000000000000000000000010 & 000000000000000000000000000011=000000000000000000000000000010(2)



http://wql.luoqin.ltd/wp-content/uploads/2020/05/unnamed-file.png

|符:其中一个为1就取1,都为0则为0(相当于逻辑运算符的||或)
例:2\3:

000000000000000000000000000010 & 000000000000000000000000000011=000000000000000000000000000011(3)

http://wql.luoqin.ltd/wp-content/uploads/2020/05/、.png

^符:两个不一样的时候为1,不一样的时候为0

例:2^5:

000000000000000000000000000010 & 000000000000000000000000000101=000000000000000000000000000111(7)

~符:单目运算符,按位取反,1变0,0变1

例:^2

000000000000000000000000000010 ->   111111111111111111111111111101(~得到的是补码需要转化为原码)

111111111111111111111111111101 (补码) -> 111111111111111111111111111100(反码) -> 100000000000000000000000000011(原码,得到-3)

http://wql.luoqin.ltd/wp-content/uploads/2020/05/unnamed-file-1.png

>>和<<:分别位按位右移和按位右移,都是有符号移动

3>>2:等于
000000000000000000000000000011 向右移动两位 000000000000000000000000000000(空出的符号位补)

http://wql.luoqin.ltd/wp-content/uploads/2020/05/》》.png

>>>:无符号右移,空出的都以0填充,不以符号位填充

^异或的加密机制:

一个数据两次异或同一个数据,原数据不变

例:int WQL1=10

int WQL2=20

WQL1^WQL2^WQL2还是等于WQL1

http://wql.luoqin.ltd/wp-content/uploads/2020/05/异或加密.png

用异或来实现数值交换

在普通的数值交换中,需要设定一个中间值来实现交换 ,而异或利用两次异或相同的原则,也可以实现数据的交换

int WQL=10;
int WQL1=10;

WQL=WQL^WQL1; WQL1=WQL^WQL1;//相当于 WQL^WQL1^WQL1 WQL=WQL^WQL1;//WQL^WQL^WQL1 http://wql.luoqin.ltd/wp-content/uploads/2020/05/交换.png

这个博客花了6个小时♠

 


路漫漫其修远兮,吾将上下而求索