2010-08-09 189 views
2

我正在查看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是分配給您的StackOverflow配置文件的圖像(就像我的天賦在那裏的粉色和白色identicon一樣)。它們是基於一個整數創建的,以唯一標識用戶。因此,例如,如果我匿名發帖,並且圖像被附加到我發佈的每篇文章中,則沒有人可以假裝他們是我(因爲他們擁有不同的知識產權,並且會散列到不同的圖像)。您可以將它用於許多事情,IP,文件散列等。它允許人們快速解釋給定的圖像是否匹配特定的散列,而無需查看十六進制編碼的數字。 – Brad 2010-08-09 04:34:49

回答

9

這與浮游物無關。這是一個掩飾。

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

f十六進制的背景下是不一個浮動。 0xf相當於小數點15

在你的榜樣,代碼是找到顏色代碼的至少顯著5位,可能在15或16位色彩空間

3

我不知道關於Java,但在C99,十六進制浮點really do exist,他們是這樣的:

0x50.1p3 

p後綴是強制性的(並且是用來表示2的冪提高數)。因此,像0x01f這樣的十六進制整數文字沒有歧義。編譯器不會將f誤認爲浮點常量後綴,它會將其讀爲十六進制數字。

+2

這也適用於Java(令我驚訝 - 學到新東西!),0x50。1p3等於640.5。 – Jesper 2010-08-09 07:24:04