2017-02-01 33 views
1

我想在Clojure中使用按位函數(bit-shift-right,bit-and等),其中操作數無符號16位整數。在Clojure中的無符號16位整數

A 16位整數是一個十進制數從0到65535,從0000 0000 0000 0000 1111 1111 1111 1111

例如這裏可選地123的二進制數是java.lang.Long中,所以將產生錯誤的答案:

(bit-not 123) 

如何使123的16位無符號整數,因此上述產生正確的答案,這是十進制65412?

因此0000 0000 0111 1011(123)應變成1111 1111 1000 0100(65412)。

回答

2

這工作:

(->> 123 
    bit-not 
    (bit-and 16rFFFF)) 
;65412 

可以縮短到:

(->> 123 
    (bit-and-not 16rFFFF)) 
;65412 

我們使用long S作爲代理無符號int秒。無論您使用哪種語言,JVM都沒有未簽名的int s或long s。

+1

我一直在使用計算器進行雙重檢查,65412是答案應該是什麼。這也是參考文獻123:http://adventofcode.com/2015/day/7 –

+1

@ChrisMurphy Oops - 掩碼應該是'16rFFFF',而不是'16rFF00'。糾正。 – Thumbnail

4

Java(和Clojure)沒有無符號整數類型。 Clojure通常只提供32位有符號整數位操作(除了unsigned-bit-shift-right,它相當於Java中的>>>)。

Java 8對通過Integer和Long類中可以執行幾個無符號運算(比較,乘,除,餘數)的新方法將16位整數視爲無符號整數的支持有限。請參閱:http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

有一些外部庫在Java中提供此功能,如https://github.com/jOOQ/jOOU

+0

'char'是一個無符號的16位值,儘管任何位操作都會將其擴展爲'int'。 –

相關問題