- 进制转换
- 十进制 --> 二进制
打比方:
// 12 = 1100(二进制)
// 11 = 1011(二进制)
官方的办法:
173 = 173÷128(2的7次方) 173%128÷64 173%128%64÷32 173%128%64%32÷16
...
173%128%64%32%16%8%4%2÷1=
1 0 1 0..1
逆推规律是:先要先找到最接近十进制整数的2n
- 十进制--> 十六进制
比方:常用到的颜色RGB
R RED 0~255
G GREEN 0~255
B BLUE 0~255
白色:R,G,B都为255 255十六进制色值就是 255÷16 255%16÷1 即为15
15
表示成十六进制就是 F F
所以白色即可表示为:0xFFFFFF
特殊情况:
负数怎么转二进制
比方:-5转二进制
转换之前先了解下二进制。反码和补码,大学都学过
例:拿十六位字节开刀 00000000 00000001
反码是: 11111111 11111110
补码是 反码+1: 11111111 11111110
先了解5的二进制是: 00000000 00000101
反码: 11111111 11111010
补码: 11111111 11111011(这便是-5的二进制表达方式)
这里需要了解的是:二进制第一位代表符号位,0 表示正数 1表示负数
因此在java中 short(十六位) 最大值是 01111111 11111111 = 215 -1
最小值是 10000000 00000000 = 01111111 11111111+1 = -215
所以这里就了解了为什么short的范围是(-215 ~215
-1)
同样的道理 byte范围是(-128~127)ps:128=27同样的道理int也是一样。
负数转二进制其实也比较简单的,先截取小数点前面的数正常转换,再把后面的数不停的乘以2直到取到小数点后面为0
打比方: 7.25 7+0.25 7--> 111
0.25×2=0.5 取0 0.5×2=1.0 所以 0.25 --> 01(用的不多知道就好了)double的范围有空可以研究下
同样n进制转十进制比较简单就不做记录了。
- 十六进制<==>二进制
比较简单首先 二进制 -->十六进制
规律:把二进制四位四位分开 分别转化
打比方:10010010 ∵ 1001 = 9 ; 0010 = 2;∴10010010 = 0x92
十六进制转二进制也是一样,逆着来就是。
- 位运算的使用
-
- 先是最简单的<< 和 >>
打比方:(以下二进制都用8位表示)
5 << 1 = 0000 0101<< 1 = 0000 1010 = 10
5 <<2 = 10<<1 = 0001 0100 = 20
规律可循 左移n位就是 乘以2n 右移同样的道理,结果是除以2n
所以代码中的乘以2除以4的代码全部可以替换了。。
特殊情况: -5 = 1111 1011 >> 1 = 1111 1101 取反码+1 = 0000 0010+1 = 3
公式理解为:
x = n>>m (m>0) x = n<<m (m>0)
当 n>0 x= x÷2m 分割线 x= n×2m
当n<0 x=(x-1)÷2m
2.& 和 | 与和或 ^ 和 ~ 异或和非
与运算:进制位上都是1才取1其他都是0,即:0&0=0; 0&1=0;1&0=0;1&1=1;
打比方:5&10 = 0000 0101 & 0000 1010 = 0000 0000 =0 11&5 = 1
或运算:进制位上只要有一个数有1就为1 ,即:0|0=0; 0|1=1;1|0=1;1|1=1;
打比方:5|10 = 0000 0101 | 0000 1010 = 0000 1111 = 15 11|5=15
利用点:2n & (2m
-1)(n>m) = 0 2n | (2m
-1)(n>m) = 2n +(2m
-1)
例如:表的权限控制 。例如设置权限 a,b,c,d值为 1,2,4,8 给甲(x)发权限(y)代码是x= x | y;判断甲权限是否有y代码是 x&y>0。
异或 (类似与磁场同级为阴) : 0^0=0; 0^ 1=1;1^0=1;1^1=0;
打比方:5^10 = 0000 0101 ^ 0000 1010 = 0000 1111 = 15 11^5 = 14
观察以上可以得出规律: (a^b) + (a&b) = a | b
非用法不一样一点 :~0=1 ;~1=0
打比方:~5 = ~0 000 0101 = 1 111 1010 = -6(取反码+1)
规律:~a = -(a+1)