2011-06-25 59 views
3

很抱歉,如果這聽起來有點「noobish」,但我不知道C++和我一直在尋找的Perlin雜一些代碼,試圖弄明白,當我遇到C++數學/六角問題

& 0x7fffffff來到

(n << 13)^n;

,我不知道是什麼意思的那些。我知道0x7fffffff是十六進制,但我不知道&是什麼意思有什麼幫助?

+0

這就是所謂的[bit twiddling](http://en.wikipedia.org/wiki/Bit_twiddling)。它就像普通的算術運算一樣,除了這些運算符直接與位相關。 – Marlon

回答

7

第一個表達式是一個位掩碼。它基本上清除了數字的高位,或等價地計算了超過2^31的數字的模。

第二個表達式是一個移位,後跟一個xor。在算術中,它與將n乘以2^13相同,然後翻轉所移位版本與其自身之間共有的所有位。它在perlin噪聲代碼中的目的是計算x,y座標的程序空間哈希,以便它們可以用來爲噪聲生成器播種。

這種相同類型的技術在大量的程序內容是用於創建動態變化的僞隨機數生成器,在空間變化確定性。這些哈希基本上是複雜的,難以預測的,幾乎是隨機的函數,通常是通過理論,猜測和實驗的混合來發現的。因此,在這種情況下,我不會過於強調爲什麼它使用特定的公式。

+0

就像'n = n * 2^13; t =(longnumbers)/ 2^31;'? – SDuke

+0

@ user677756:不完全。第一個表達式是t =(長數)%pow(2,31)。第二個表達式是n =(n * pow(2,13))+ n - (加入時所有的位) – Mikola

+0

好吧,這樣做更有意義,但最後一個問題,究竟是什麼位,我將如何找到添加時攜帶的那些? (我不知道任何C,只是盧阿,PHP和HTML,對不起) – SDuke

0

&是按位AND運算符。所以& 0x7fffffff從32位整數中剝離有符號位。這意味着,它使最左邊的int爲零。

而在第二個,第一n左移使用<<運算符,它是左移位運算符,並且該表達的異或操作使用n本身的結果13。

+0

謝謝,但我仍然不知道這意味着什麼?抱歉。 D: – SDuke

4

&是逐位AND運算符在C++

按位與運算(&)的第一操作數的每個比特進行比較,以所述第二操作數的相應位。如果兩個位都爲1時,相應的結果位設置爲1,否則,相應的結果的位被設置爲0

 11111111 11110000 
    & 00000000 01100011 
    _________________ 
    00000000 01100000 

<<是位用C明智左移位運算++

運算符將其第一個操作數左移一個由其第二個操作數給出的位數,在右側填充新的0位。

0 1 0 1 0 1 1 0 << 2 
    _____________________ 
    0 1 0 1 0 1 1 0 0 0 

^是EX-OR運算符在C++

的按位異或運算符其第一操作數的每個比特進行比較,以它的第二個操作數的相應位。如果一個比特爲0,而其它比特爲1時,相應的結果位設置爲1,否則,相應的結果的位被設置爲0

 0 1 0 1 0 1 1 0 
^0 0 1 1 0 0 1 0 
    ___________________ 
    0 1 1 0 0 1 0 0 

所以,& 0x7fffffff套位31的32位的整數爲零,並留下其他值與他們的值。

(n << 13)^nn左移13並且結果與n異或。

+0

但是如果它是一些數字AND 0x7fffffff,會不會總是返回0x7fffffff?並感謝您解釋<< – SDuke

+0

好吧,讓我們暫時將0x7fffffff縮短爲0x7f。假設您正在執行151 AND 0x7f - 在二進制中,這是10010111和01111111.結果是,通過取兩個操作數中的所有位爲1,結果爲00010111.它做了什麼?這是第一個屏蔽了。你的答案是151,刪除了第一位。答案是23. –

0

符號&<<,和^被稱爲運營商。有一個維基百科頁面列出了C/C++ operators,因此您可以瞭解這些運營商的名稱,然後在Google中搜索以獲取更多信息。

0x7fffffff是寫在十六進制(基數爲16)表示法的整數。前綴0x表示它是十六進制。

n可能是定義你所援引的線以上的幾行一個整數變量的名稱。

括號起到表達式分組在一起,這樣在你的榜樣,他們保證n變左移13位之前它就會與正進行XOR運算。如果沒有括號,操作順序將由operator precedence(在您的示例中恰好給出相同的結果)確定。

0

& 0x7fffffff裝置設定的位(推測)32位整數的31到零,通過30位保留0的值; IOW,使32位整數爲正; IOW,取整數的絕對值。

(n << 13)^n;意味着移位n左移13位,然後xor移位值與原始值n

HTH