我需要執行一個左移操作,其操作方式與JavaScript完全相同。問題是這樣的:在Clojure中實現JavaScript的左移操作符
a << 16
行爲就像Clojure的 「位左移位」 只有當一個< = 32767:
// JS
32767 << 16 // 2147418112
32768 << 16 // -2147483648
567890 << 16 // -1437466624
;; CLJ
(bit-shift-left 32767 16) // 2147418112
(bit-shift-left 32768 16) // 2147483648
(bit-shift-left 567890 16) // 37217239040
我注意到,在做 「37431 < < 16」 的時候, JS在二進制級別上完成與Clojure完全不同的事情。雖然Clojure的轉換1001001000110111爲10010010001101110000000000000000,JS轉變1001001000110111到1101101110010010000000000000000:
// CLJ, then JS
10 01001 00011 01110 00000 00000 00000
1 10110 11100 10010 00000 00000 00000
我注意到這是兩個互補的,我注意到,因爲它不僅可以(出於某種原因)使用超過32位的JS可能會做這這個(所有的位級操作都是在32位上完成的,也許是?),所以我想知道如果數字大於32767,我是否應該使用二進制補碼。但是再次,我是Clojure新手,所以我不是很確定如何做到這一點。