0x01和0x01f之间的区别

3
我正在查看Identicons的原始代码。有一段代码对红、绿和蓝色分量进行了一些位操作:
int blue = (code >> 16) & 0x01f;
int green = (code >> 21) & 0x01f;
int red = (code >> 27) & 0x01f;

code变量是一个32位整数。

我的问题是:数字0x01和0x01f之间有什么区别?

我猜测f表示该值为浮点数,但为什么要将其设置为浮点数?是因为二进制中的浮点表示与整数表示不同吗?这不会在移植时引起可移植性问题,如果特定语言不使用相同的表示方法,会造成问题吗?

此外,由于不理解0x01f问题,我可能读错了,但这只是将红色、绿色和蓝色表示设置为0或1,具体取决于最低有效位吗?


当然,我太傻了。显然我的大脑今天还没有启动。 因此,通过这段代码,RGB数据将是一个16位的565 RGB值。 但是颜色的绿色分量只使用了5个比特。 这是否意味着Identicon代码没有使用哈希、IP等提供的所有比特位? - Brad
1
什么是Identicons?它们是Decepticons的远房亲戚吗? - NullUserException
1
Identicons是分配给您StackOverflow配置文件的图像(就像我这里的粉色和白色Identicon标志一样)。它们是基于单个整数创建的,以唯一地标识用户。例如,如果我匿名发布内容,并附有每篇文章的图像,那么没有人可以假装他们是我(因为他们将有不同的IP地址,并且它将散列为不同的图像)。您可以将其用于许多事情,例如IP地址、文件哈希等。它允许人类快速解释给定图像是否与特定哈希匹配,而无需查看十六进制编码的数字。 - Brad
3个回答

10

那与浮点数无关,那是一个位掩码。

0x01f = 0b11111

当你对一个数字使用 & 运算符时,它会清除从右边数第5位的所有位。

这里是如何得到 0x0a2bfb & 0x01f => 0x00001b 的:

0x0a2bfb : 0000 1010 0010 1011 1111 1011
0x01f    : 0000 0000 0000 0000 0001 1111 &
----------------------------------------
result   : 0000 0000 0000 0000 0001 1011

3

我不确定Java是否支持,但在C99中,十六进制浮点数确实存在,长这样:

0x50.1p3

p后缀是必须的(用于表示要将数字提高到2的多少次幂)。因此,与十六进制整数字面量(如0x01f)不会有歧义。编译器不会将f误认为是浮点常量后缀,它会将其作为十六进制数字来读取。


2
这在Java中也适用(令我惊讶-学到了新东西!),0x50.1p3等于640.5。 - Jesper

2
在十六进制上下文中,f不是浮点数。0xf等同于十进制的15
在你的示例中,该代码正在寻找颜色代码中最不重要的5个位,可能在15或16位颜色空间中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接