JavaScript是一門用于網(wǎng)頁編程的動態(tài)語言,其功能十分強(qiáng)大,包括位操作,這是一項有用而且在很多場景下仍然含有重要地位的編程技巧。位操作是一種特殊的操作,它們不是像加號或減號那樣的算術(shù)操作,而是對數(shù)位進(jìn)行操作。在這篇文章中,我們將介紹一些常見的位操作,還有一些有趣的例子。
首先,讓我們看一下JavaScript中的位運算符。
& 與 | 或 ^ 異或 ~ 取反 << 左移 >> 右移 >>> 無符號右移
這些位運算符可用于整數(shù),而在JavaScript中字符串,浮點數(shù)等都會被強(qiáng)制轉(zhuǎn)換為整數(shù)。
首先,讓我們來看一下與運算符(&)。這個運算符將比特位置相同的兩個操作數(shù)都設(shè)為1,則輸出1,否則輸出0。以下是一些示例:
5 & 3; // 1 (0101 & 0011 = 0001) 15 & 9; // 9 (1111 & 1001 = 1001) 25 & 30; // 24 (11001 & 11110 = 11000)
接下來是按位或運算符(|)。這個運算符將比特位置相同的兩個操作數(shù)中只要有一個為1,則輸出1,否則輸出0。以下是一些示例:
5 | 3; // 7 (0101 | 0011 = 0111) 15 | 9; // 15 (1111 | 1001 = 1111) 25 | 30; // 31 (11001 | 11110 = 11111)
接下來是異或運算符(^)。這個運算符將相同位上相同的比特設(shè)為0,不同位上不同的比特設(shè)為1。以下是一些示例:
5 ^ 3; // 6 (0101 ^ 0011 = 0110) 15 ^ 9; // 6 (1111 ^ 1001 = 0110) 25 ^ 30; // 7 (11001 ^ 11110 = 00111)
接下來是按位取反運算符(~)。這個運算符將每個比特進(jìn)行取反操作(0變成1,1變成0)。以下是一些示例:
~5; // -6 (~00101 = 11010) ~15; // -16 (~1111 = 0000) ~25; // -26 (~11001 = 00110)
接下來是左移運算符(<<)。這個運算符將操作數(shù)的所有比特向左移動n位,并在最右邊添加n個0。以下是一些示例:
5 << 1; // 10 (0101 << 1 = 1010) 6 << 2; // 24 (0110 << 2 = 11000) 2 << 3; // 16 (0010 << 3 = 10000)
接下來是右移運算符(>>)。這個運算符將操作數(shù)的所有比特向右移動n位,并且在最左端添加n個符號位。以下是一些示例:
5 >> 1; // 2 (0101 >> 1 = 0010) 10 >> 2; // 2 (1010 >> 2 = 0010) 20 >> 3; // 2 (10100 >> 3 = 00010)
最后是無符號右移運算符(>>>)。這個運算符將操作數(shù)的所有比特向右移動n位,并且在最左端添加n個0。以下是一些示例:
5 >>> 1; // 2 (0101 >>> 1 = 0010) 10 >>> 2; // 2 (1010 >>> 2 = 0010) 20 >>> 3; // 2 (10100 >>> 3 = 00010)
現(xiàn)在,讓我們看一些JavaScript中使用位操作符的有趣的例子。
首先,我們將使用位移運算符來生成隨機(jī)數(shù)。例如,以下的代碼生成一個隨機(jī)數(shù):
var rand = (Math.random() * 0x100000000)>>>0;
接下來,我們將使用位運算符來計算數(shù)字的奇偶數(shù)。例如,以下代碼將返回一個數(shù)字a的奇偶校驗結(jié)果:
function evenParity(a) { var parity = 0; while (a) { parity ^= a & 1; a >>= 1; } return parity; }
最后,讓我們用位運算符來解決一道有趣的數(shù)學(xué)問題 - 計算兩個數(shù)字的GCD。例如,以下代碼計算兩個數(shù)字a和b的GCD:
function GCD(a, b) { while (b != 0) { var t = b; b = a % b; a = t; } return a; }
這些是位操作符在JavaScript中的使用。位操作符可能看起來有點神秘,但是它們可以成為解決實際問題的有力工具。在實際使用中,總是記得仔細(xì)閱讀位操作符的文檔,并小心處理邊緣情況,以確保您的代碼能夠正常運行。