二進位制位運算子

2022-09-13 16:18:11 字數 1839 閱讀 2155

二進位制位運算子用於直接對二進位制位進行計算,一共7個。

i = i | 0;
上面這行**的意思就是將i(不管是整數或小數)轉為32位整數。利用這一特性,可以寫乙個函式,將任意數值轉為32位整數。

function toint32(x) 

toint32(1.001) // 1

toint32(1.999) // 1

toint32(1) // 1

toint32(-1) // -1

toint32(math.pow(2, 32) + 1) // 1

toint32(math.pow(2, 32) - 1) // -1

上面**中,toint32可以將小數轉為整數。對於一般的整數,返回值不會有任何改變。對於大於或等於2的32次方的整數,大於32位的數字都會被捨去。

如上。二進位制與運算子(&)的規則是逐位比較兩個運運算元,兩個二進位制位之中只要有乙個位為0,就返回0,否則返回1。

二進位制否運算子(~)將每個二進位制位都變為相反值。

~ 3 // -4
上面表示式對3進行二進位制否運算,得到-4。之所以會得到這樣的結果,是因為運算時,j**ascript內部將所有的運運算元都轉為32位的二進位制整數再進行運算。

3的32位整數形式是00000000000000000000000000000011,二進位制否運算之後得到的是11111111111111111111111111111100。由於第一位是1,所以這個數是乙個負數。j**ascript內部採用補碼形式表示負數,即需要將這個數減去1再取反,然後加上負號,才能得到這個負數對應的10進製值。這個數減1之後得到11111111111111111111111111111011,再取反得到00000000000000000000000000000100,再加上負號就是-4。考慮到這樣的過程比較麻煩,可以簡單記憶成,乙個數與自身取反值相加等於-1

對於乙個整數,連續兩次二進位制否運算,得到它自身。

二進位制否運算遇到小數時,也會將小數部分捨去,只保留整數部分。所以,對乙個小數連續兩次進行二進位制否運算,能達到取整的效果。使用二進位制否運算取整,是所有取整方法中最快的一種

~~2.9 // 2
對字串進行二進位制否運算,j**ascript引擎會先呼叫number函式,將字串轉為數值。

對於其他型別的值,二進位制否運算也是先用number轉為數值,然後再進行處理。

異或運算有乙個特殊運用,連續對兩個數進行三次異或運算,可以互換它們的值。這是互換兩個變數的值的最快的方法。

var a = 10;

var b = 99;

a ^= b, b ^= a, a ^= b;

a // 99

b // 10

異或運算也可以用來取整。

左移運算子(<<)表示將乙個數的二進位制值向左移動指定的位數,尾部補0,即乘以2指定的次方。如果左移0位,就相當於將該數值轉為32位整數,等同於取整,對於正數和負數都有效。

例如:

var color = ;

// rgb to hex

// (1 << 24)的作用為保證結果是6位整數

var rgb2hex = function(r, g, b)

右移運算子(>>)表示將乙個二進位制向右移動指定的位數,頭部補0,即除2的指定次方,最高位符號位不參與移動

帶符號位的右移運算子(>>>)表示將乙個數的二進位制形式向右移動,包括符號位也參與移動,頭部補0。所以該運算總是得到正值。

js 二進位制位運算子

ecmascript 整數有兩種型別,即有符號整數 允許用正數和負數 和無符號整數 只允許用正數 在 ecmascript 中,所有整數字面量預設都是有符號整數,這意味著什麼呢?有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值範圍從 214748...

二進位制 位操作運算子

1,二進位制 資料在記憶體中是用二進位制儲存的,二進位制是指由0,1兩個元素組成。其常見的編碼方式有三種 原碼,反碼,補碼 2 位 記憶體中最小儲存單元是位,也稱為bit。常常用8個bit儲存乙個字元,即1byte 8bit。3 位操作 是指cpu對記憶體中的二進位制數進行操作。包括 與 或 異或 ...

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...