var ddd = Math.random() * 16;
console.log((ddd & 3 | 8).toString(16));
お願い助けて。この演算子(|と&)がどのように機能するのか、なぜこのコードがaf記号を返すのかわかりません。
var ddd = Math.random() * 16;
console.log((ddd & 3 | 8).toString(16));
お願い助けて。この演算子(|と&)がどのように機能するのか、なぜこのコードがaf記号を返すのかわかりません。
式ddd & 2 | 8
は、8のビット単位のOR演算と、および2のビット単位のAND演算を使用して、ビット単位の演算を実行しddd
ます。ビット単位の演算がわからない場合は、この記事を参照して、それらが何であるかを説明してください。
16
基数パラメーターをNumber.toString
プロトタイプメソッドに渡したため、コードはafの範囲の文字を返すことができます。これは、数値が16進数で表示されることを意味します。
これにより、0から15までのランダムな実数が選択されます。
var ddd = Math.random() * 16;
たとえば、11.114714370026688を取得する場合があります。
ddd & 3
これは、結果と数値3のビット単位のANDです。最初に行うことはddd
、浮動小数点数に対してビット単位の演算子が定義されていないため、から数値を取得して整数に変換することです。ddd
したがって、私の例では、整数として11として扱われます。
次に行うことは、2つの数値の2進表現のANDを実行することです。バイナリの11はで1011
、3は0011
です。それらをANDすると、両方の数値に1がある場合を除いて、すべてゼロの2進数が得られます。最後の2桁だけが両方の数値に1を持っているので、結果は0011
であり、これも10進数の3に等しくなります。
| 8
これは、これまでの結果(3)のビット単位のORを数値8で実行します。ORはANDに似ていますが、いずれかの数値に1がある場合は常に、結果に1が含まれます。30011
つはまだ2進数で、8つは1000
であるため、結果は1011
-になります。これは10進数の11に戻ります。
一般に、上記の計算では、8ビット(右から3番目)を1に設定し、4ビット(右から2番目)を0に設定し、他のビットはそのままにします。最終結果は、0〜15の範囲にあった元の乱数を取得し、それを8、9、10、または11の4つの数値のいずれかに変換することです。したがって、これは乱数を生成する非常に回りくどい方法です。 8から11まで。Math.floor(8 + Math.random()*4)
もっと簡単な方法で同じことをしたでしょう。
次に、結果を16進数(基数16)で出力するため、、、(基数16では8
10 9
)a
、またはb
(11)が得られます。