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