微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 位掩码的规则是什么?像0xFF vs. 0xFC

我正在制作一个创建程序生成的地牢的游戏,我找到了一个使用位掩码来检索房间号和门类型等内容的例子.

在该示例中,他使用位掩码从每个图块的整数中提取细节.并且整数被这样分解

0xLLSDRRET

L - is the Level Number
S - Denotes a special tile(Like Stairs)
D - is if its a door,and what type(Door,Arch,Trapped)
R - Room number
E - Flags an entrance to a room
T - Names the type of tile(Floor,Cooridor,Blocked)

在这里,他使用一个位掩码来获取,例如,房间号码,如:

int[][] map = new int[40][40] 
int $ROOM_ID = 0x0000FF00;
System.out.println(map[x][y] & $ROOM_ID);

现在有了这个,如果map [x] [y]是例如0x00001200,那么输出将是1200.这部分掩模我明白了.

但在源$ROOM_ID是ACTUALLY 0x0000FFC0,我不明白C做什么,因为我尝试了不同的值,我似乎无法抓住C做的,例如

0x00001200 output-> 1200
0x00001210 output-> 1200
0x00001220 output-> 1200
0x00001230 output-> 1200
0x00001240 output-> 1240
0x00001250 output-> 1240
0x00001260 output-> 1240
0x00001270 output-> 1240
0x00001280 output-> 1280
0x00001290 output-> 1280
0x000012A0 output-> 1280
0x000012B0 output-> 1280
0x000012C0 output-> 12C0
0x000012D0 output-> 12C0
0x000012E0 output-> 12C0
0x000012F0 output-> 12C0

有更多位掩码知识的人可以解释为什么0x0000FFC0& 0x000012F0 = 12C0?

解决方法

你正在做的是按位算术.暂时忽略高位(因为它们都是0)并且只考虑两个十六进制值0xFFC0和0x12F0.然后按位并且与基数10中的乘法完全相同.它在位级上看起来像这样:

0xFFC0 = 1111111111100000

&安培;

0x12F0 = 0001001011110000

然后等于0001001011100000 = 0x12F0

转换为十六进制二进制的技巧就是这个.每两个十六进制数字是一个字节(即8位).例如,0xFF是单个字节.因此,您可以通过简单地为每个十六进制数字写入位值(即0xF(base-16)= 1111(base-2)= 15(base-10))将其转换为二进制表示.由于我们知道每个字节总是精确为8位,因此每个十六进制数字都会转换为自己的4位二进制表示.然后,您只需要记住十六进制值0000(0)到1111(F)的二进制表示,并适当地替换它们.这个技巧在两个方向都有效.

就位掩码而言,这对于从位向量中提取值非常有用.位向量(通常)是一种简单的数据类型(即int,char等).然后,每个特定位表示要启用或禁用的值类型.因此,如果我有一个位向量(char =单字节,所以请考虑这个数据类型为bitvector,例如)0x01,而我的最低位表示门已启用,则此位向量有一个门.如果我的bitvector的值是0x02,那么没有门启用(但在0x03中有一扇门).为什么是这样?您需要始终查看基础二进制表示以完全理解位向量/位掩码.

0x01 = 00000001,0×02 = 00000010,0×03 = 00000011

如您所见,在第一个和第三个值中,设置了最低位.但是,在第二个值中,设置第二个最低位,但不是最低位.但是,您可以使用此第二个值来表示另一个属性(尽管出于示例的目的,第二个值中没有门).

然后注意,从上面格式化的位向量中检索门的相应位掩码(巧合)将是0x01,因为0x01& 0x01 = 1,0×02& 0x01 = 0,和0x03& 0x01 = 1(再次返回二进制表示并乘以)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?