javascript——ビットオペレータアプリケーション
6024 ワード
ビット演算:
ビット演算子は、(&)、(~)、または(124)、または(^^)を含みます.
&:両方の操作数のビットが同時に1の場合、結果は1、さもなくば0となります.1100&1010=1000のように
|:両方の操作数のビットが片方が1である場合、結果は1で、そうでないと0です.1100|1010=1110のように
~:0は1,1は0になります.
^:両方のビットが違っています.結果は1です.そうでないと0です.1100^1010=0110のようです.
ビット移動演算子:
<<左にシフトし、左にシフトして元の値を表します.
例えば、3<<2(3はint型)1)を2進数0000 0000 0000,000,0011,2に変換し、この数字の上位(左側)の2つのゼロを2桁左にシフトし、他の数字は2桁ずつ左にシフトします.3)は下位(右側)の2つの空席でゼロを補います.結果としては0000 0000 0000 0000 0000 0000 1100であり、10進数に変換すると12である.
同じ理屈で>>右へ移動することを表します.
ビット操作器(bitwise operators)
私たちの多くの人はJSにオペレーターがいることを知っています.各数値はバイナリの表現形式を持っていますが、これらのビットはバイナリ値の計算に使用できます.整数値のバイナリ値を確認して、基本パラメータ「2」をtoStering()に送ることができます.
http://www.gbtags.com/gb/debug/96aa31cd-7aeb-49f2-9bbc-7a31310b89cf.htm
コードは以下の通りです
時々、私たちはビット演算子でMath.flor()の代わりに、Math.flor()は四捨五入ではなく整数部分を得ることができます.
二つの変数の交換を見てください.一般的な解決策は臨時変数を作成して目的を達成しますが、これは本当に効率的ではありません.ビット演算を採用するのはより簡単です.
学習位演算のもっと多い技巧はjs apの良いところを作ります:Sean Erron Andeson's site[Stnford PhD]
添付jsテクニック:
使う代わりにtrue:falseはもっと簡潔です.
ビット演算子は、(&)、(~)、または(124)、または(^^)を含みます.
&:両方の操作数のビットが同時に1の場合、結果は1、さもなくば0となります.1100&1010=1000のように
|:両方の操作数のビットが片方が1である場合、結果は1で、そうでないと0です.1100|1010=1110のように
~:0は1,1は0になります.
^:両方のビットが違っています.結果は1です.そうでないと0です.1100^1010=0110のようです.
ビット移動演算子:
<<左にシフトし、左にシフトして元の値を表します.
例えば、3<<2(3はint型)1)を2進数0000 0000 0000,000,0011,2に変換し、この数字の上位(左側)の2つのゼロを2桁左にシフトし、他の数字は2桁ずつ左にシフトします.3)は下位(右側)の2つの空席でゼロを補います.結果としては0000 0000 0000 0000 0000 0000 1100であり、10進数に変換すると12である.
同じ理屈で>>右へ移動することを表します.
ビット操作器(bitwise operators)
私たちの多くの人はJSにオペレーターがいることを知っています.各数値はバイナリの表現形式を持っていますが、これらのビットはバイナリ値の計算に使用できます.整数値のバイナリ値を確認して、基本パラメータ「2」をtoStering()に送ることができます.
var number = 5;
var result = number.toString(2);
// In case we want to change the number directly, not
// a variable with a number value, we need to use two
// dots - it's equivalent of 14.0.toString where we can
// show that decimal part of the number is equal to 0.
// ( ), ‘.’- 14.0.toString, 0
var result2 = 13..toString(2);
document.getElementById('result').innerHTML = result + ', ' + result2;
Result: 101, 1101
まだいくつかの操作があります.たとえば、変数aが5に等しいと仮定します.bは13に等しいです.以下は例です.http://www.gbtags.com/gb/debug/96aa31cd-7aeb-49f2-9bbc-7a31310b89cf.htm
コードは以下の通りです
Result:
<p>a | b = <span id="or"></span></p>
<p>a & b = <span id="and"></span></p>
<p>a ^ b = <span id="xor"></span></p>
<p>~ a = <span id="not"></span></p>
<p>a >> b = <span id="rs"></span></p>
<p>a << b = <span id="ls"></span></p>
<p>a >>> b = <span id="zfrs"></span></p>
// helper function for displaing results
var output = function(operator, result) {
document.getElementById(operator).innerHTML = result;
};
// variables
var a = 5;
var b = 13;
// a | b - OR
// if in any of the given numbers corresponding bit
// is '1', then the result is '1'
output('or', a|b); // 13
// a & b - AND
// if in both of the given numbers corresponding bit
// is '1', then the result is '1'
output('and', a&b); // 5
// a ^ b - XOR
// if in one of the given numbers (not both)
// corresponding bit is '1', then the result is '1'
output('xor', a^b); // 8
// ~a - NOT
// inverts all the bits
output('not', ~a); // -6
// a >> b - RIGHT SHIFT
// shift binary representation of 'a' for 'b'
// bits to the right, discarding bits shifted off
output('rs', a>>b); // 0
// a << b - LEFT SHIFT
// shift binary representation of 'a' for 'b'
// bits to the right, shifting in zeros from the right
output('ls', a<<b); // 40960
// a >>> b - ZERO FILLED RIGHT SHIFT
// shift binary representation of 'a' for 'b'
// bits to the right, discarding bits shifted off,
// and shifting in zeros from the left.
output('zfrs', a>>>b); // 0
時々、私たちはビット演算子でMath.flor()の代わりに、Math.flor()は四捨五入ではなく整数部分を得ることができます.
var data = 2.2352524535;
var result = data | 0;
document.getElementById('result').innerHTML = result;
Result: 2
実際の場面では、私たちはどうやってビット操作ができますか?例えば、RGBの色の値を16進数に変換できます.// helper function for displaing results
var output = function(operator, result) {
document.getElementById(operator).innerHTML = result;
}
// variables
var color = {r: 186, g: 218, b: 85};
// RGB to HEX
var rgb2hex = function(r, g, b) {
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).substr(1);
}
output('color', rgb2hex(color.r, color.g, color.b));
二つの数の中の最大値または最小値を見つけることができます.// helper function for displaing results
var output = function(operator, result) {
document.getElementById(operator).innerHTML = result;
}
// variables
var a = 9285;
var b = 3569;
// a ^ ((a ^ b) & -(a < b)) - which one, a or b, is bigger?
output('max', a ^ ((a ^ b) & -(a < b)));
// b ^ ((a ^ b) & -(a < b)) - which one, a or b, is smaller?
output('min', b ^ ((a ^ b) & -(a < b)));
今はjsのmatchライブラリの最適化が十分ですので、これらのhackを使って実行効率には何の意味もありません.二つの変数の交換を見てください.一般的な解決策は臨時変数を作成して目的を達成しますが、これは本当に効率的ではありません.ビット演算を採用するのはより簡単です.
// helper function for displaing results
var output = function(operator, result) {
document.getElementById(operator).innerHTML = result;
}
// variables
var a = 10;
var b = 99;
// a^=b, b^=a, a^=b - swap variables using XOR operation,
// details: http://en.wikipedia.org/wiki/XOR_swap_algorithm
a^=b, b^=a, a^=b;
output('a', a);
output('b', b);
javascript 1.7に「Pythonish」変数交換方式を導入しても、ビット演算は依然として最も速いです.学習位演算のもっと多い技巧はjs apの良いところを作ります:Sean Erron Andeson's site[Stnford PhD]
添付jsテクニック:
使う代わりにtrue:falseはもっと簡潔です.