0x01和0x01f之间的差异

问题描述:

我正在查看Identicons的原始源代码。 有一个代码位,它的一些位操作,以提取的红,绿和蓝分量:0x01和0x01f之间的差异

int blue = (code >> 16) & 0x01f; 
int green = (code >> 21) & 0x01f; 
int red = (code >> 27) & 0x01f; 

代码变量是一个32位的整数。

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

我假设f表示值是一个浮点数,但为什么使它浮动?二进制中的浮点表示与整型表示是不同的吗?如果移植某个特定语言不使用相同的表示形式,那么这不会导致便携性原因的问题吗?

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

+0

当然,这是我的愚蠢。显然,我的大脑今天还没有启动。 所以通过这个代码,RGB数据将是一个16位565 RGB值。 但是,颜色的绿色部分仅使用6位中的5个。 这是否意味着Identicon代码没有使用哈希,ip等中提供的总位数? – Brad 2010-08-09 04:26:48

+1

无论如何,Identicons是什么?狂派的一些远房表兄弟? – NullUserException 2010-08-09 04:28:05

+1

Identicons是分配给您的*配置文件的图像(就像我的天赋在那里的粉色和白色identicon一样)。它们是基于一个整数创建的,以唯一标识用户。因此,例如,如果我匿名发帖,并且图像被附加到我发布的每篇文章中,则没有人可以假装他们是我(因为他们拥有不同的知识产权,并且会散列到不同的图像)。您可以将它用于许多事情,IP,文件散列等。它允许人们快速解释给定的图像是否匹配特定的散列,而无需查看十六进制编码的数字。 – Brad 2010-08-09 04:34:49

这与浮游物无关。这是一个掩饰。

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 

f十六进制的背景下是不一个浮动。 0xf相当于小数点15

在你的榜样,代码是找到颜色代码的至少显著5位,可能在15或16位色彩空间

我不知道关于Java,但在C99,十六进制浮点really do exist,他们是这样的:

0x50.1p3 

p后缀是强制性的(并且是用来表示2的幂提高数)。因此,像0x01f这样的十六进制整数文字没有歧义。编译器不会将f误认为浮点常量后缀,它会将其读为十六进制数字。

+2

这也适用于Java(令我惊讶 - 学到新东西!),0x50。1p3等于640.5。 – Jesper 2010-08-09 07:24:04