Java 无符号右移和位掩蔽的应用

Java 无符号右移和位掩蔽的应用,java,bit-manipulation,Java,Bit Manipulation,当我浏览了许多网站,然后在位掩蔽上发布这个问题,我只知道它是用来切换1到0之间的开关,通常用于基于像素的图形项目。现在,作为一个初学者,我真的不明白为什么我们要切换开关,以及它是如何在图形中使用的为什么我们要使用位屏蔽来提取位??答案在于JLS。第5.6.2节: 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数: 如果其中一个操作数的类型为double,则另一个操作数将转换为double 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float 否则,如果

当我浏览了许多网站,然后在位掩蔽上发布这个问题,我只知道它是用来切换1到0之间的开关,通常用于基于像素的图形项目。现在,作为一个初学者,我真的不明白为什么我们要切换开关,以及它是如何在图形中使用的为什么我们要使用位屏蔽来提取位?

答案在于JLS。第5.6.2节:

加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double
  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
  • 否则,两个操作数都将转换为int类型
最后一点很有意思。这意味着在执行换档操作之前,将
b
转换为
int

因此,
b
,以前是
0xF1
,现在升级为
0xfffff1

然后执行移位:

0xFFFF FFF1 >>> 4 == 0x0FFF FFFF
然后转换为
字节

(byte) 0x0FFF FFFF == 0xFF
(byte) 0x0000 000F == 0x0F
然后得到
b==-1


e
因遮罩而为15

首先,
b
0xF1
提升到
0xfffff1

然后它被
0xFF
编辑:

0xFFFF FFF1 & 0x0000 00FF == 0x0000 00F1
然后右移4位:

0x0000 00F1 >> 4 == 0x0000 000F
然后将其转换为
字节

(byte) 0x0FFF FFFF == 0xFF
(byte) 0x0000 000F == 0x0F
你得到
e==15


编辑:点击“F”的次数不够,结果是16位
int
s。。。希望已修复,谢谢@Stefan

当您似乎只在谈论Java时,为什么要用三种不同的语言来标记它?在一组随机的编程语言中,符号扩展和位移位的规则不可能是相同的……即使这一点保持不变,Java int不是也是32位的,而不是16位的吗?@Stefan对了,必须加上更多的
F
s。。。谢谢你的接球!