n
表明位位數 = 2^n-1
| 1 |
是奇數,因此能夠根據第一位| 1 |
的數值判斷一個數值是奇數仍是偶數num % 2
運算本質就是取的| 1 |
的值,若是是1就是奇數,是0就是偶數const getBinary = num => num.toString(2)
~
~
的處理過程函數
實質上是對數字求負,而後減1-num - 1
code
&
和 OR |
和 XOR ^
&
每一個數字中的數位對齊,位對位進行與運算|
每一個數字中的數位對齊,位對位進行或運算^
每一個數字中的數位對齊,位對位進行異或運算<<< 、>>>
和無符號移動 <<、>>
<<
相等於乘於2,而右移>>
至關於除於2因爲二進制的結構是| 16 | 8 | 4 | 2 | 1 |
這種結構,位數是從右邊開始的,咱們遍歷要從右邊開始blog
function eachBit(num, callback) { while (num) { num >>= 1 } }
10 = (0,1,0,1,0)
,最靠近左邊的1
在第四位2^4-1 = 8
,| 8 |
,因此遍歷了4次遍歷的次數
和當前的位數
以及被右移出去的值(0或1)
傳遞給callback
function eachBit(num, callback) { let i = 0 let bitNum = 0 while (num) { // 奇偶位或第一位的值,也即即將被右移出去的值 const value = num % 2 // 位數 = 2^i bitNum = Math.pow(2, i) callback && callback(value, i, bitNum) // 右移1位 num >>= 1 i++ } }
function repeat(str, n) { let res = '' eachBit(n, v => { if (v === 1) { res += str } if (n > 1) { str += str } }) return res }
eachBit
,好比n = 10
那麼二進制'1010'
只需遍歷四次| 8 |
,第二位1對應| 2 |
str += str
就是一直迭代,重複次數是2^n
(n是遍歷的次數)v === 1
的時候也即| 2 |
,這時候是str + str
2個重複的str
,| 8 |
是8個重複的str
str
的重複次數是對應| 2 |
和| 8 |
的,恰好重複10次n > 1
是n等於1,沒有必要再執行迭代了,只會遍歷一次,且v必等於1,後面沒有必要執行了