编程小技巧,提高代码性能
2018-11-21 本文已影响7人
赵荆州
- 位移(<<、>>、>>>》)操作
先来看看常见数的二进制表达(用8位数表达):
十进制 | 二进制 |
---|---|
1 | 0000 0001 |
2 | 0000 0010 |
3 | 0000 0011 |
4 | 0000 0100 |
5 | 0000 0101 |
6 | 0000 0110 |
7 | 0000 0111 |
8 | 0000 1000 |
PS:通常负数的二进制以补码(在原码的基础上,1转0,0转1,符号位不变)的方式存储
PS:二进制通常高位为符号码,0正,1负
常见用法:
- 求2的3次方
观察上面表格中二进制数的规律,可以得出,如果用移位运算,只需左移两位即可,2<<2
。
记忆方法:求2的n次方,只需要左移2的n-1位即可。
验证:求2的2次方:2次方,只需左移1位即可,2<<1,得出0000 0100
,对照表格可得知为4. - 求数组下标的中间位置
例如快速排序通常需要获得数组(长度为8)的中间下标
普通方法:长度8/2=4
移位方法:通过观察上面表格中的二进制数规律,可以得出,如果通过移位只需右移一位即可,8>>1
。
PS:>>>和>>区别,当移位的数是负数的时候,>>将二进制高位用1补上,而>>>将二进制高位用0补上,这就导致了>>>将负数的移位操作结果变成了正数(因为高位用0补上了)
- 与或异(&|^)操作
与(&),都为1时得1,否则为0
常见用法:
- 清零
清零指定位(4位):0110011011 & 1111110000 = 0110010000。
实际应用:子网掩码,打开你的ip配置,一般常见子网掩码都设置为255.255.255.0,转换为二进制为11111111.11111111.11111111.0000000,如果你的ip是192.168.1.125,将取得网关为192.168.1。 - 区分奇偶
x & 1 ,如果结果为0则为偶数,为1则为奇数。例如3 & 1,转换为二进制进行与运算为: 0000 0011 & 0000 0001 最后结果为0000 0001即1。为奇数。在例如 2 & 1,转换为二进制进行与运算为: 0000 0010 & 0000 0001 最后结果为0000 0000即0。为偶数。 - 取指定位