當我們處理數(shù)字時,通常會使用的運算符有加、減、乘、除等。而在js中還有一類運算符,那就是移位運算符。移位運算符可以讓我們對數(shù)字進行二進制位的移動,進而實現(xiàn)一些效果。
在移位運算中,有三種運算符:左移(<<)、右移(>>)、和無符號右移(>>>)。以下是它們的基本語法:
var a = 2; //二進制:10 //左移1位 var b = a<< 1; //二進制: 100 //右移1位 var c = a >>1; //二進制: 1 //無符號右移1位 var d = a >>>1; //二進制: 1
接下來,我們分別介紹一下這三種運算符及其應(yīng)用。
左移運算符(<<):將二進制數(shù)向左移動指定的位數(shù)。左移過程中,右側(cè)補 0,也就是在后面插入 0。比如將一個數(shù)左移1位,相當于將這個數(shù)乘以 2。就像這樣:
var a = 2; //二進制:10 //左移1位 var b = a<< 1; //二進制: 100
右移運算符(>>): 將二進制數(shù)向右移動指定的位數(shù)。右移過程中,左側(cè)根據(jù)符號位填充,也就是對于正數(shù)填充 0,負數(shù)填充 1。比如將一個數(shù)右移1位,相當于將這個數(shù)除以 2。就像這樣:
var a = 2; //二進制:10 var b = -2; //二進制:11111111111111111111111111111110 //右移1位 var c = a >>1; //二進制: 1 var d = b >>1; //二進制: 11111111111111111111111111111111
無符號右移運算符(>>>): 將二進制數(shù)向右移動指定的位數(shù)。右移過程中,左側(cè)補 0,忽略符號位的填充規(guī)則。比如將一個數(shù)無符號右移1位,相當于將這個數(shù)除以 2,不管這個數(shù)的符號是怎樣的,都會將二進制最左側(cè)的 1(如果存在)丟棄。就像這樣:
var a = 2; //二進制:10 var b = -2; //二進制:11111111111111111111111111111110 //無符號右移1位 var c = a >>>1; //二進制: 1 var d = b >>>1; //二進制: 01111111111111111111111111111111
在開發(fā)中,移位運算可以實現(xiàn)一些妙用。比如快速計算 2 的 n 次方:
var a = 2; //2的0次方 var b = a<< 1; //2的1次方 var c = b<< 1; //2的2次方 var d = c<< 1; //2的3次方
以上代碼就實現(xiàn)了從 2 的 0 次方到 2 的 3 次方的快速計算。這種方法用于數(shù)據(jù)量較小,需要頻繁計算的場合。
再比如,移位運算可以實現(xiàn)一些二進制相關(guān)的操作,比如獲取二進制數(shù)的某一位值:
//獲取二進制數(shù)的第 2 位 var num = 10; // 二進制:1010 var bit = 2; var val = (num >>(bit - 1)) & 1; console.log(val); //輸出 1
以上代碼就可以輸出二進制數(shù) 1010 的第 2 位值,也就是1。
總的來說,移位運算符可以讓我們更加靈活地處理數(shù)字,以適應(yīng)開發(fā)中的各種要求。當然,使用移位運算符需要注意一些細節(jié),比如溢出、精度等問題,不同的運算符還存在不同的特性。因此在使用時需要根據(jù)具體需求進行選擇。