【问题标题】:Differences between 0x01 and 0x01f0x01 和 0x01f 的区别
【发布时间】:2011-03-27 02:58:09
【问题描述】:

我正在查看 Identicons 的原始源代码。 有一些代码可以用来提取红色、绿色和蓝色分量:

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

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

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

我假设 f 表示该值是浮点数,但为什么要让它成为浮点数?二进制中的浮点表示与整数表示不同吗?如果特定语言不使用相同的表示形式,那么在移植时不会因为可移植性原因而导致问题吗?

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

【问题讨论】:

  • 当然,我太傻了。我的大脑今天显然还没有启动。因此,通过此代码,RGB 数据将是 16 位 565 RGB 值。但是颜色的绿色分量只使用了 6 位中的 5 位。这是否意味着 Identicon 代码没有使用哈希、ip 等中提供的总位数?
  • Identicons 到底是什么?霸天虎的一些远亲?
  • 标识是分配给您的 StackOverflow 配置文件的图像(就像我的天赋在那里的粉红色和白色标识一样)。它们是基于单个整数创建的,以唯一标识用户。因此,例如,如果我匿名发帖,并且我发布的每个帖子都附有一张图片,那么没有人可以假装他们是我(因为他们有不同的 IP,它会散列到不同的图片)。你可以使用它用于很多事情,IP,文件哈希等。它允许人类快速解释给定图像是否与特定哈希匹配,而无需查看十六进制编码的数字。

标签: java floating-point hex int


【解决方案1】:

这与浮动无关。那是位掩码。

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

【讨论】:

    【解决方案2】:

    我不确定 Java,但在 C99 中,十六进制浮点数 really do exist,它们看起来像这样:

    0x50.1p3
    

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

    【讨论】:

    • 这也适用于 Java(令我惊讶 - 学到了新东西!),0x50.1p3 等于 640.5。
    【解决方案3】:

    f 在十六进制的上下文中是 not 浮点数。 0xf 等价于十进制的15

    在您的示例中,代码正在查找颜色代码的最低有效 5 位,可能在 15 位或 16 位颜色空间中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 2011-10-20
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2010-12-21
      • 2011-05-11
      相关资源
      最近更新 更多