一、进制转换
进制符号:二进制是B,八进制是O,十进制是D,十六进制是H
下面进制转换的图转自百度经验:
https://jingyan.baidu.com/article/3065b3b6b7937fbecff8a4e0.html
1、二进制转十进制:
(1011101.101)b
2、十进制转二进制:
整数 除2 拿商 继续除,直至到商为0;小数部分 一直乘以2,直至到小数变为整数
3、二进制转八进制:
4、八进制转二进制
5、二进制转十六进制
6、十六进制转二进制:
7、八进制转十进制
8、十进制转八进制
9、八进制转十六进制
10、十六进制转八进制
11、十进制转十六进制
12、十六进制转十进制
二、进制运算
1、位运算概述:
简单位运算符:
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1,否则为0 |
| | 或 | 两个位都为0时,结果才为0,否则为1 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
复合赋值位运算符:
符号 | 描述 | 运算规则 |
---|---|---|
&= | 例:a&=b | 相当于a=a&b |
|= | 例:a|=b | 相当于a=a|b |
>>= | 例:a>>=b | 相当于a=a>>b |
<<= | 例:a<<=b | 相当于a=a<<b |
^= | 例:a^=b | 相当于a=a^b |
2、&:与运算,两个位都是1,结果才为1,否则为0
如:
10100
& 11110
———————
10100
扩展:
(1)清0操作
对某一段数据单元的数据清零,即将其全部的二进制位为0
a = a & 0x0
设a =15 = 0000 0000 0000 1110
a = a & 0x0 = 0000 0000 0000 1110 & 0 = 0000 0000 0000 0000
(2)获取一个数据的指定位
如获取整型数a = 321的低八位操作: a = a & 0xFF
= 0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111
= 0000 0000 0100 0001
获取a = 321 的高八位操作:a = a & 0xFF00
= 0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000
= 0000 0001 0000 0000
(3)判断偶数
由于奇数第一位都是1,偶数第一位都是0,于是常用:
if((n & 1) == 0) 判断偶数,代替 if (a % 2 == 0)
if((n & 1) == 1) 判断奇数,代替 if (a % 2 == 1)
3、|:或运算,两个位都是0时,结果才为0,否则为1
如:
10100
| 11110
———————
11110
4、^:异或运算,两个相同为0,不同为1
如:
10100
^ 11110
———————
01010
扩展:
(1)判断数值是否相同
a ^ b = 0,当两个数异或运算等于0时,说明两个数相同
(2)两个数交互
设不同的两个数 a 和 b,则 a = (a^b)^b,即一个数和另一个数异或两次运算后不变,
由于这个原理常用于两个数交互运算。
一般java中交两个数交互写法:
int a = 1;
int b = 2;
int c = a;
a = b;
b = c;
而用位操作实现不用第三方变量:
int a = 1;
int b = 2;
a ^= b;
b ^= a;
a ^= b;
5、~:取反运算,是0则变1,是1则变0
如:
10100
~ 11110
———————
01010
扩展:
(1)变换符号
变换符号,数变成负数,负数变成正数,比如 a是正数,要变为负数,那么:
~a + 1
6、<< : 有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。
如:
2 << 3
移动前:00010 (2)10
移动后:10000 (16)10
相当于:2 * 8
同样:
2 << 1 = 2 * 2
2 << 2 = 2 * 4
所以:
x << 1 = x * 2
x << 2 = x * 4
x << 3 = x * 8
x << 4 = x * 16
x << n = x * 2^n
则 x 移动 n位 等于 十进制的x 乘以 2 的n次方
7、>> :有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。
无符号时和<<运算符相反:
x >> 1 = x / 2
x >> 2 = x / 4
x >> n = x / 2^n
8、>>> : 无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
9、扩展
异或位运算简单加密:
byte[] b = {1,2,3,5,6};
byte key = 123;
//依次加密的代码
for(int i = 0;i < b.length;i++){
b[i] = (byte)(b[i] ^ key); //利用异或加密
}
//解密的代码
for(int i = 0;i < b.length;i++){
b[i] = (byte)(b[i] ^ key); //利用异或解密
}
参考:
1、https://jingyan.baidu.com/article/3065b3b6b7937fbecff8a4e0.html
2、https://www.zhihu.com/question/38206659
3、https://www.jianshu.com/p/f1783080526a