2011-06-25 15 views
3

申し訳ありませんが、これは少し「noobish」を聞こえるが、私はC++を知っていないと私はC++数学/六角質問

& 0x7fffffffに出くわしたときにそれを理解しようと、パーリンノイズのためにいくつかのコードを見ていた場合

(n << 13)^n;

と私はそれらが何を意味するか見当がつかない。私は0x7fffffffが16進数であることを知っていますが、私は&が何を意味するのかわかりません助けが必要ですか?

+0

。通常の算術演算と似ていますが、これらの演算子はビットに直接関係します。 – Marlon

答えて

7

最初の式はビットマスクです。基本的には、数値の上位ビットをクリアするか、2^31以上の数値のmodを等価的に計算します。

2番目の式はshiftで、その後にxorが続きます。算術演算では、nに2^13を掛けた後、シフトされたバージョンとそれ自身の間で共通するすべてのビットを反転するのと同じことになります。パーリンノイズコードの目的は、x、y座標の手続き型空間ハッシュを計算して、ノイズジェネレータをシードするために使用できるようにすることです。

このタイプの手法は、空間的に確定的に変化する動的に変化する擬似乱数ジェネレータを作成するために多くの手順コンテンツで使用されます。これらのハッシュは、基本的には複雑で、予測が難しく、ほとんどランダムな関数であり、通常、理論、推測の仕事、実験の混合で発見されます。結果として、なぜこの特定の式を使用しているのかについて、あまりにも難しく考えることはお勧めしません。

+0

だから 'n = n * 2^13; t =(longnumbers)/ 2^31; '? – SDuke

+0

@ user677756:まあまあです。最初の式は、t =(長い数字)%pow(2,31)です。 2番目の式は、n =(n * pow(2,13))+ n - (追加時に運ばれたすべてのビット)です。 – Mikola

+0

これは意味がありますが、最後の質問です。追加するときに運ばれたものを見つけますか? (私はc、ちょうどルア、PHP、html、知らない) – SDuke

0

&は、ビット単位のAND演算子です。したがって、& 0x7fffffffは32ビット整数から符号付きビットを取り除きます。つまり、intの左端のビットがゼロになります。

2つ目に、最初nは左シフトされ13と<<左シフト演算子であり、オペレータ、及びn自体とXOR演算に使用されるこの式の結果を使用して。

+0

ありがとうございますが、私はまだそれが何を意味するのか分かりません。ごめんなさい。 D: – SDuke

4

&

ビット単位のAND演算子(&)は、第2オペランドの対応するビットに最初のオペランドの各ビットを比較し、C++でビット単位のAND演算子です。両方のビットが1である場合、対応する結果ビットは、そうでなければ1に設定され、対応する結果ビットが0

 11111111 11110000 
    & 00000000 01100011 
    _________________ 
    00000000 01100000 

<<に設定されているCのビットワイズ左シフト演算子である++

< <演算子は、その第1オペランドを、第2オペランドによって与えられたビット数だけ左にシフトし、右に新しい0ビットを埋め込む。

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

^ C++

ビット単位の排他的OR演算子でEX-OR演算子であり、その第二のオペランドの対応するビットへの最初のオペランドの各ビットを比較します。 1ビットが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セットは、32ビットの31ビット場合整数をゼロにし、他のビットにはそれらが持っていた値を残す。

(n << 13)^nnは、13で左シフトされ、結果はnと排他的論理和が取られます。

+0

ですが、それが何らかの数字で0x7fffffffだったら、常に0x7fffffffを返しますか? << – SDuke

+0

を説明してくれてありがとう、ちょっと今0x7fffffffを0x7fに短縮しよう。だから、あなたは151と0x7fをやっているとしましょう。バイナリでは10010111と01111111です。結果は、両方のオペランドで1であるすべてのビットをとることで、00010111となります。最初のビットがマスクされました。あなたの答えは最初のビットが削除された151です。答えは23です。 –

0

シンボル&<<、および^オペレーターと呼ばれています。 C/C++ operatorsという名前のWikipediaのページがありますので、それらの演算子の名前について学び、Googleで詳細な情報を検索することができます。

0x7fffffffは、16進数(16進数)で書かれた整数です。 0xという接頭辞は、それが16進数であることを意味します。

おそらくnは、引用した行の数行上に定義された整数変数の名前です。

括弧は式をグループ化するためのものです。したがって、例では、nはnとXORされる前にnが13ビット左にシフトすることを保証します。かっこがなければ、操作の順序はoperator precedence(この例では同じ結果が得られます)によって決定されます。

0

& 0x7fffffffは、(推定された)32ビット整数のビット31を0に設定し、ビット0から30の値を保持することを意味します。 IOW、32ビット整数を正の値にする。 IOW、整数のabs valを取る。

(n << 13)^n;手段はnの元の値と値シフト次いで13ビット、XORだけ左シフトn

[ビットいじる(http://en.wikipedia.org/wiki/Bit_twiddling)と呼ばれるHTH