Ich muss eine Links-Shift-Operation ausführen, die sich genau wie JavaScript verhält. Das Problem ist, dass dies:Implementieren des Linksverschiebungs-Operators von JavaScript in Clojure
a << 16
verhält sich wie Clojure der "Bit-Shift-links" nur dann, wenn ein < = 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
Ich bemerkte, dass, wenn dabei "37431 < < 16", JS macht etwas völlig anderes als Clojure auf einer binären Ebene. Während Clojure 1001001000110111 in 10010010001101110000000000000000 verwandelt, verwandelt JS 1001001000110111 in 1101101110010010000000000000000:
// CLJ, then JS
10 01001 00011 01110 00000 00000 00000
1 10110 11100 10010 00000 00000 00000
Ich bemerke das Komplement ist zwei, und ich merke, dass JS dies tun kann, weil es nicht (aus irgendeinem Grund) mehr als 32 Bits für verwenden Dies (alle Bit-Level-Operationen auf 32 Bit, vielleicht?), so frage ich mich, ob ich Zweierkomplement auf die Zahl anwenden sollte, wenn es über 32767 ist. Aber andererseits bin ich ein Clojure-Neuling, also bin ich nicht sehr sicher, wie man das macht.