读 高级程序设计第四版 有感而发。
小技巧
判断奇偶
• 偶数 8 & 1 = 0
• 奇数 9& 1 =1
• 原理是:
• 二级制1是一堆0和最后一个1组成。 00000001 
• 二级制最后一位是 2^0 是否存在。奇数是存在的,所以是1,偶数也就是0
• 结论:偶数0,奇数1
• 两真为真。遇到0一定是0,都是1才是真。结果取决于最后一位数字
• 因此奇数一定是1
值交换,不占空间:
var a=6var b=9a^=bb^=aa^=b// aba操作三次。a//9b//6
取整:
~操作符
// ~ 非let num1 = 25 //二进制00000000000000000000000000011001let num2 = ~num1 //二进制11111111111111111111111111100110// 作用是全部取反// 等效为 数值去反并减一// -25 -1 == -26let num3 = -num1 -1// 效果一样 但操作速度快
&操作符
// %// 两个数字对齐,然后求真let r = 25 & 3 // 125 =0000000000000000000000000001100103 =00000000000000000000000000000011---and=00000000000000000000000000000001得到的结果是 1
小技巧:
判断奇偶
- 偶数 8 & 1 = 0
 - 奇数 9& 1 =1
 - 原理是:
- 二级制1是一堆0和最后一个1组成。 
00000001 - 二级制最后一位是 
2^0是否存在。奇数是存在的,所以是1,偶数也就是0 - 结论:偶数0,奇数1
 - 两真为真。遇到0一定是0,都是1才是真。结果取决于最后一位数字
 - 因此奇数一定是1
 
 - 二级制1是一堆0和最后一个1组成。 
 
| 或操作符
// | 求或,一真则真25=0000000000000000000000000001100103=00000000000000000000000000000011---OR=00000000000000000000000000011011// 原理都懂 555
异或 ^
// 一假为真25= 0000000000000000000000000001100103= 00000000000000000000000000000011---XOR=00000000000000000000000000011010
小技巧两值交换,不占空间:
var a=6var b=9a^=bb^=aa^=b// aba操作三次。a//9b//6
左移 <<
// 指定位数向左移动 正负号不变// 2<<5 == 642 = 1064= 10 00000
右移
也一样,只不过注意负数差异性会很大,注意即可。这里应当贴一个小技巧。
无符号右移 >>>
数字变成二进制、丢次低位补0,因此总是非负数。
如果本来就是非负数,和 >> 没区别
取整:
5.55>>0或者整数
-1 其他
本文大量参考了红宝书,你可以移步到这里看到的笔记总结: 《高级程序设计 第四版》
rgb 和 hex 互相换算:
function hexToRGB(hex: string): string{const hexx = hex.replace('#', '0x')const r = hexx >> 16const g = hexx >> 8 & 0xffconst b = hexx & 0xffreturn `rgb(${r}, ${g}, ${b})`}function RGBToHex(rgb: string): string{const rgbArr = rgb.split(/[^\d]+/)const color = rgbArr[1] | rgbArr[2] << 8 | rgbArr[3]return `#${color.toString(16)}`}
