2017-02-01 6 views
1

Я хотел бы использовать Побитовое функции (bit-shift-right, bit-and и т.д.) в Clojure, где операнды беззнаковые 16-битные целые числа.беззнаковые 16-битные целые числа в Clojure

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 не имеет unsigned int s или long s, независимо от того, какой язык вы используете.

+1

Я проверил двойную проверку с калькулятором, и 65412 - вот какой ответ. Это также то, что 123 в этой ссылке: http://adventofcode.com/2015/day/7 –

+1

@ChrisMurphy Упс - маска должна быть '16rFFFF', а не' 16rFF00'. Исправленный. – Thumbnail

4

Java (и Clojure) не имеют целочисленного типа без знака. Clojure в основном обеспечивает только 32-разрядные операции со знаком целочисленного бита (кроме unsigned-bit-shift-right, что эквивалентно >>> в Java).

Java 8 имеет ограниченную поддержку для обработки 16-разрядного целого числа как целого без знака с помощью новых методов в классах Integer и Long, которые могут выполнять несколько операций без знака (сравнивать, умножать, делить, остаток). См.: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

Есть внешние библиотеки, которые предоставляют эту функциональность на Java, а также https://github.com/jOOQ/jOOU.

+0

'char' - это 16-битное значение без знака, хотя любая битвальная операция расширит его до' int'. –