在函数内部将 Long 转换为 Integer
Casting Long to Integer inside function
我正在编写一个函数,将三个数字 (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
构造函数和 .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"
然后是我的版本。所以我需要转换为 Integer
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中,一个Integer
只有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
我正在编写一个函数,将三个数字 (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
构造函数和 .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"
然后是我的版本。所以我需要转换为 Integer
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中,一个Integer
只有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