计算机在执行计算时会把数值转化成二进制的形式,位运算就是就是计算机的底层二进制的计算方式,位运算符就是计算符号
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个小时♠
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109