Clojure 在函数内部强制转换长整数
我正在编写一个函数,它将三个数字(r、g、b)转换为一个整数,Clojure 在函数内部强制转换长整数,clojure,casting,long-integer,Clojure,Casting,Long Integer,我正在编写一个函数,它将三个数字(r、g、b)转换为一个整数,java.awt.Color (defn to-rgb ([r g b] (bit-or (long 4278190080) ; the alpha channel = (bit-shift-left 255 24) (bit-shift-left r 16) (bit-shift-left g 8) b))) 使用Color构造函数
java.awt.Color
(defn to-rgb
([r g b] (bit-or
(long 4278190080) ; the alpha channel = (bit-shift-left 255 24)
(bit-shift-left r 16)
(bit-shift-left g 8)
b)))
使用Color
构造函数和.getRGB
bitmap> (.getRGB (Color. 0 0 0))
-16777216
bitmap> (type (.getRGB (Color. 0 0 0)))
java.lang.Integer
(Integer/toBinaryString (.getRGB (Color. 0 0 0)))
"11111111000000000000000000000000"
然后是我的版本。所以我需要转换成一个整数
bitmap> (to-rgb 0 0 0)
4278190080
bitmap> (Integer. (to-rgb 0 0 0))
-16777216 ; as expected
所以我决定将强制转换放在函数中,因为我总是希望返回一个整数
(defn to-rgb2
([r g b] (Integer. (bit-or
(long 4278190080)
(bit-shift-left r 16)
(bit-shift-left g 8)
b))))
bitmap> (to-rgb2 0 0 0)
IllegalArgumentException Value out of range for int: 4278190080 clojure.lang.RT.intCast (RT.java:1205)
在Java中,整数只有32位。将其更改为
Long
:
(Long. ...)
问题是常量4278190080
以十六进制转换为0xFF000000
,我们看到设置了最左边的位。在Java中,由于整数值是32位有符号的,所以不能设置最左边的位,因为它在二补表示法中是为负数保留的
java.lang.Integer.MAX_VALUE = 0x7FFFFFFF
用十六进制
更新 如果需要将其作为32位值,请使用
Long.intValue()
如下所示:
(defn to-rgb3
([r g b] (.intValue
(Long. (bit-or
(long 4278190080)
(bit-shift-left r 16)
(bit-shift-left g 8)
b)))))
(dotest
(spyxx (to-rgb3 0 0 0)))
(to-rgb3 0 0 0) => java.lang.Integer->-16777216
但是我需要值
-16777216
,它来自于将long转换为整数。它应该与(.getRGB(Color.0))
的返回值相匹配。我想我的编辑使它更清晰了不是吗?我的问题是,为什么强制转换在函数外部工作(是的,它转换为neg),而不是在函数内部工作?。intValue
就是我要找的:)请注意,.intValue
返回一个原始Javaint
,然后哪个Clojure自动装箱到一个Integer
对象中。Number.intValue
在纯Clojure中更习惯地表示为unchecked int
。