2017-02-01 5 views
1

ビット単位 Clojureで符号なし16ビット整数である関数(bit-shift-rightbit-andなど)を使用したいと思います。Clojureの符号なし16ビット整数

16ビット整数は、0から65535まで進数1111ここで例えば123 1111 1111 1111

から0000 0000 0000 0000から代替的にバイナリ数であるがjava.lang.Longので、意志

(bit-not 123) 

がどのように私は123以上の十進数で65412で正しい答えを、生成するように、符号なし16ビット整数を作るのです:間違った答えを生成?

So 0000 0000 0111 1011(123)は1111 1111 1000 0100(65412)になるはずです。

答えて

2

これは動作します:

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

あなたはそれを短縮することができます。私たちは、符号なしintのためのプロキシとしてlong Sを使用している

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

。使用する言語にかかわらず、JVMには符号なしintまたはlongがありません。

+1

私は計算機で二重チェックしており、答えは65412です。それはまた123がこの参照にあるものです:http://adventofcode.com/2015/day/7 –

+1

@ChrisMurphyおっと - マスクは '16rFFFF'ではなく' 16rFFFF'でなければなりません。修正されました。 – Thumbnail

4

Java(およびClojure)には、符号なし整数型はありません。 Clojureは主に32ビットの符号付き整数ビット演算のみを提供します(unsigned-bit-shift-rightはJavaの>>>に相当します)。

Java 8は、いくつかの符号なし演算(compare、multiply、divide、remainder)を行うことができる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'に広げます。 –

関連する問題