摘要:二進制或運算符符號為,表示若兩個二進制位都為,則結果為,否則為。上面代碼對三個變量進行二進制或運算,得到掩碼值為二進制的。有了掩碼,二進制或運算可以確保打開指定的開關。二進制與運算可以將當前設置中凡是與開關設置不一樣的項,全部關閉。
概述
作用速度塊
都作用于32位整數
二進制位運算符用于直接對二進制位進行計算,一共有7個。
二進制或運算符(or):符號為|,表示若兩個二進制位都為0,則結果為0,否則為1。
二進制與運算符(and):符號為&,表示若兩個二進制位都為1,則結果為1,否則為0。
二進制否運算符(not):符號為~,表示對一個二進制位取反。
異或運算符(xor):符號為^,表示若兩個二進制位不相同,則結果為1,否則為0。
左移運算符(left shift):符號為<<,詳見下文解釋。
右移運算符(right shift):符號為>>,詳見下文解釋。
頭部補零的右移運算符(zero filled right shift):符號為>>>
做位運算的時候,是以32位帶符號的整數進行運算的,并且返回值也是一個32位帶符號的整數
利用這個特性,可以寫出一個函數,將任意數值轉為32位整數。
function toInt32(x) {
return x | 0;
}
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
二進制或運算符
兩個二進制位之中只要有一個為1,就返回1,否則返回0。
0 | 3 // 3
二進制與運算符
兩個二進制位之中只要有一個位為0,就返回0,否則返回1。
0 & 3 // 0
二進制否運算符
二進制否運算符(~)將每個二進制位都變為相反值(0變為1,1變為0
簡單記憶成減去-1
對一個小數連續進行兩次二進制否運算,能達到取整效果。
~~2.9 // 2
~~47.11 // 47
~~1.9999 // 1
~~3 // 3
使用二進制否運算取整,是所有取整方法中最快的一種。
對字符串進行二進制否運算,JavaScript 引擎會先調用Number函數,將字符串轉為數值。
// 相當于~Number("011")
~"011" // -12
// 相當于~Number("42 cats")
~"42 cats" // -1
// 相當于~Number("0xcafebabe")
~"0xcafebabe" // 889275713
// 相當于~Number("deadbeef")
~"deadbeef" // -1
// 相當于 ~Number([])
~[] // -1
// 相當于 ~Number(NaN)
~NaN // -1
// 相當于 ~Number(null)
~null // -1
異或運算符
異或運算(^)在兩個二進制位不同時返回1,相同時返回0。
相當于加 與相當于乘以
用“異或運算”可以在不引入臨時變量的前提下,互換兩個變量的值。
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
這是互換兩個變量的值的最快方法。
異或運算也可以用來取整。
12.9 ^ 0 // 12
左移運算符
左移運算符(<<)表示將一個數的二進制值向左移動指定的位數,尾部補0,即乘以2的指定次方
// 相當于乘以2的1次方
4 << 1
// 8
-4 << 1
// -8
如果左移0位,就相當于將該數值轉為32位整數,等同于取整,對于正數和負數都有效。
13.5 << 0
// 13
-13.5 << 0
// -13
右移運算符
右移運算符(>>)表示將一個數的二進制值向右移動指定的位數。如果是正數,頭部全部補0;如果是負數,頭部全部補1。右移運算符基本上相當于除以2的指定次方(最高位即符號位參與移動)
右移運算可以模擬 2 的整除運算。
5 >> 1
// 2
// 相當于 5 / 2 = 2
21 >> 2
// 5
// 相當于 21 / 4 = 5
21 >> 3
// 2
// 相當于 21 / 8 = 2
21 >> 4
// 1
// 相當于 21 / 16 = 1
頭部補零的右移運算符
該運算的結果與右移運算符(>>)完全一致,區別主要在于負數
查看一個負整數在計算機內部的儲存形式,最快的方法就是使用這個運算符。
4 >>> 1
// 2
-4 >>> 1
// 2147483646
-1 >>> 0 // 4294967295
上面代碼表示,-1作為32位整數時,內部的儲存形式使用無符號整數格式解讀,值為 4294967295(即(2^32)-1,等于11111111111111111111111111111111)。
開關作用
位運算符可以用作設置對象屬性的開關
假定某個對象有四個開關,每個開關都是一個變量。那么,可以設置一個四位的二進制數,它的每個位對應一個開關。
var FLAG_A = 1; // 0001
var FLAG_B = 2; // 0010
var FLAG_C = 4; // 0100
var FLAG_D = 8; // 1000
9.1然后,就可以用二進制與運算檢驗,當前設置是否打開了指定開關。
var flags = 5; // 二進制的0101
if (flags & FLAG_C) {
// ...
}
// 0101 & 0100 => 0100 => true
上面代碼檢驗是否打開了開關C。如果打開,會返回true,否則返回false。
9.2
現在假設需要打開A、B、D三個開關,我們可以構造一個掩碼變量。
var mask = FLAG_A | FLAG_B | FLAG_D;
// 0001 | 0010 | 1000 => 1011
上面代碼對A、B、D三個變量進行二進制或運算,得到掩碼值為二進制的1011。
有了掩碼,二進制或運算可以確保打開指定的開關。
flags = flags | mask;
二進制與運算可以將當前設置中凡是與開關設置不一樣的項,全部關閉。
flags = flags & mask;
異或運算可以切換(toggle)當前設置,即第一次執行可以得到當前設置的相反值,再執行一次又得到原來的值。
flags = flags ^ mask;
二進制否運算可以翻轉當前設置,即原設置為0,運算后變為1;原設置為1,運算后變為0。
flags = ~flags;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106062.html
摘要:所以就想把一大串縮短點,將二進制中的三位用一位表示。以可以大寫也可以小寫開頭版本可以表示二進制了八進制的數據表現形式由組成。結果把系數基數的權次冪相加即可。因為語言采用的是碼來編碼的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序執行的過程中其值不可以發生改變 B:Java中常量的分類 字面值常量 自定義常量(面向對象部分講) C:字面值常量的...
摘要:位運算符是對其操作數按其二進制形式逐位進行運算。接下來我們逐一講解位運算符的計算原理按位與用于清零取某些指定位保位的計算原理,,結果上面使用按位與的一段程序運行結果為我們用二進制來分析一下它的計算規則。 C語言中位運算符共有六種 目錄 1.&(按位與) 2. |(按位或) 3.^(按位抑或)...
摘要:二進制本身就是為這個數字而使用的,所以說這道面試題直指二進制的使用是沒錯的。正負在二進制中,第一位為的是負數,是正數。 showImg(https://segmentfault.com/img/bVbd7d0?w=1580&h=732); 前言 使用PHP,給定一個數,判斷這個數是否是二的N次方 這樣看似簡單的一個面試題, 實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答...
摘要:上篇文章上篇文章中已經介紹了中的一些常見的運算符的操作,今天介紹上次遺留的一個運算符位運算符。在學習位運算符之前,需要先了解一下二進制的相關概念。二進制在計算機中,只會識別和的二進制數據,位運算符就是把數值都當做二進制來進行計算。 上篇文章中已經介紹了python中的一些常見的運算符的操作,...
閱讀 3880·2021-09-23 11:51
閱讀 3067·2021-09-22 15:59
閱讀 868·2021-09-09 11:37
閱讀 2070·2021-09-08 09:45
閱讀 1267·2019-08-30 15:54
閱讀 2065·2019-08-30 15:53
閱讀 492·2019-08-29 12:12
閱讀 3290·2019-08-29 11:15