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