为什么将平铺转换为长平铺的移位整数掩码返回零?(Java,位移位)
我正在尝试创建一个掩码,以便在Java中查看长屏幕上的特定位。我尝试了以下方法:为什么将平铺转换为长平铺的移位整数掩码返回零?(Java,位移位),java,long-integer,bit-shift,bitmask,tilde,Java,Long Integer,Bit Shift,Bitmask,Tilde,我正在尝试创建一个掩码,以便在Java中查看长屏幕上的特定位。我尝试了以下方法: long mask = ~ (0xffffffff << 32); long mask=~(0xffffffffJava假设,如果对int执行算术运算,则希望返回int,而不是long(在计算完成后将输出指定给long,这一事实不会影响计算本身。) 将int(32位)左移32位不会产生任何效果。将int左移时,只使用右侧操作数的五个最低阶位,给出一个0到31之间的数字。 这就是为什么(0xfffff
long mask = ~ (0xffffffff << 32);
long mask=~(0xffffffffJava假设,如果对int
执行算术运算,则希望返回int
,而不是long
(在计算完成后将输出指定给long
,这一事实不会影响计算本身。)
将int
(32位)左移32位不会产生任何效果。将int
左移时,只使用右侧操作数的五个最低阶位,给出一个0到31之间的数字。
这就是为什么(0xffffffffJava假设如果您对int
执行算术运算,那么您希望返回int
,而不是long
(在计算完成后将输出分配给long
不会影响计算本身)
将int
(32位)左移32位不会产生任何效果。将int
左移时,只使用右侧操作数的五个最低阶位,给出一个0到31之间的数字。
这就是为什么(0xffffffff左移位是模†数据类型的大小,例如,32位整数的移位没有影响
(0xffffffff << 32) ==
(0xffffffff << (32 % Integer.SIZE)) ==
(0xffffffff << (32 % 32)) ==
(0xffffffff << 0) ==
0xffffffff
†严格来说,最后5位表示整数,最后6位表示长整数,这与负左移位的模不同。左移位是模†数据类型的大小,例如,32位整数的移位没有影响
(0xffffffff << 32) ==
(0xffffffff << (32 % Integer.SIZE)) ==
(0xffffffff << (32 % 32)) ==
(0xffffffff << 0) ==
0xffffffff
†严格来说,整数取最后5位,长整数取最后6位,这与左负移位的模不同。好吧,现在我明白了。我刚刚尝试了长掩码=~(long)0xffffffff“将所有整数位保留为零”但是他们~
它,所以,解释为什么它仍然是0。强制转换在操作执行后发生,因此您可以将其视为一个两步过程:-int intmask=~(0xFFFFFF好的,现在我明白了。我只是尝试了long mask=~(long)0xFFFFFF“将所有int位保留为零”但是,他们将~
它,因此,请解释为什么它仍然是0。强制转换在操作执行后发生,因此您可以将其视为一个两步过程:-int intmask=~(0xffffffff当您执行int时执行int
(0xffffffffL << 32) ==
(0xffffffffL << (32 % Long.SIZE) ==
(0xffffffffL << (32 % 64) ==
(0xffffffffL << 32) ==
0xffffffff00000000L