JavaScript中的邏輯運(yùn)算符與位運(yùn)算符

邏輯運(yùn)算符

1.&& 邏輯與

a && b

運(yùn)算邏輯:

a && b, 若 a 為 false 則返回 a, 若 a 為 true 則返回 b

 console.log(3 && 1) // 1
 console.log(0 && 1) // 0 
 // ps: 0為false

總結(jié):假前真后

2.|| 邏輯或

a || b

運(yùn)算邏輯:

a || b, 若 a 為 false 則返回 b, 若 a 為 true 則返回 a

console.log(3 || 1) // 3
console.log(0 || 1) // 1
console.log('' || true) // true
// ps: ''空字符串在js中也會被判定為false
console.log(!!'') // false

總結(jié):真前假后

3.! 邏輯非

!a

運(yùn)算邏輯:

若 a 為 true, 則返回 false, 反之亦然

console.log(!1) // false

若要顯式的返回變量的布爾值則可以使用 !! 雙重非運(yùn)算符 來運(yùn)算

console.log(!!1) // true
console.log(!!0) // false

需要注意的是在JS中會被轉(zhuǎn)換為 false 的表達(dá)式有:

  • null
  • undefined
  • NaN
  • 0
  • 空字符串("" or '' or ``)

總結(jié): 取反

位運(yùn)算符

其實(shí)位運(yùn)算符是所有語言通用的運(yùn)算符弧可,偷懶起見還是寫在了JS分類下哈哈哈

位運(yùn)算符都需要將運(yùn)算符前后的數(shù)轉(zhuǎn)為二進(jìn)制再運(yùn)算, 所謂的位是二進(jìn)制數(shù)的位數(shù)

1.| 按位或運(yùn)算符

a | b

運(yùn)算規(guī)則:

0|0=0带族;0|1=1糊肠;1|0=1轻纪;1|1=1侨把;即: a 和 b 的對應(yīng)二進(jìn)制位只要有一個為1兄旬,其值為1赖瞒。

console.log(3 | 4) // 7
// 3轉(zhuǎn)為二進(jìn)制0011, 4轉(zhuǎn)為二進(jìn)制0100, 所以結(jié)果為0111, 輸出7
console.log(31 | 2) // 31
// 31 -> 00011111 2 -> 00000010, 結(jié)果為00011111, 輸出31

實(shí)際應(yīng)用:

可用于小數(shù)取整

//后面為0時取小于該小數(shù)的最大整數(shù)
console.log(3.1 | 0) // 3
// 所有的位運(yùn)算只會對小數(shù)起作用所以 3.1 | 0 會自動舍去小數(shù)部分達(dá)到取整效果
// 相當(dāng)于 Math.floor(3.1);

2.& 按位與運(yùn)算符

a & b

運(yùn)算規(guī)則:

0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:a 與 b 的對應(yīng)二進(jìn)制位同時為“1”翁逞,結(jié)果才為“1”总珠,否則為0.

console.log(3 & 4) // 0
console.log(31 & 2) // 2

3.~ 取反運(yùn)算符

~a

運(yùn)算規(guī)則:

將a按二進(jìn)制位取反, 即將0變1, 1變0, 然后將二進(jìn)制數(shù)變?yōu)楦↑c(diǎn)數(shù)

console.log(~25) // -26
// 00000000000000000000000000011001 -> 11111111111111111111111111100110 -26
// 就像是將正數(shù)變負(fù), 再取其反碼

從表現(xiàn)上而言 ~ 是對數(shù)字求負(fù), 然后減 1, 因此 25 變 -26.

4.^異或運(yùn)算符

a ^ b

運(yùn)算規(guī)則:

0^0=0; 0^1=1; 1^0=1; 1^1=0; a 和 b 办绝,按二進(jìn)制位進(jìn)行“異或”運(yùn)算。

^ 運(yùn)算符滿足如下運(yùn)算規(guī)則

  • 交換律:AB=BA
  • 結(jié)合律:ABC=A(BC)=(AB)C
  • 自反律:ABB=A^0=A
  • X^X=0 ,X^0=X
console.log(23^3) // 20
// 23 -> 00010111 3 -> 00000011 異或后為 00010100 -> 20

5. << 左移運(yùn)算符

a << b

運(yùn)算規(guī)則:

將a的各二進(jìn)制位全部左移b位(左邊的b個二進(jìn)制位丟棄姚淆,右邊補(bǔ)0)孕蝉。

console.log(3 << 2) // 12
// 3 -> 0011 運(yùn)算結(jié)果為 1100 -> 12

就結(jié)果而言, 左移運(yùn)算符 << 便是 a 乘上 2 的 b 次方

6. >> 右移運(yùn)算符

運(yùn)算規(guī)則:

將a的各二進(jìn)制位全部右移b位(右邊的b個二進(jìn)制位丟棄,若是正數(shù), 左邊補(bǔ)0, 若是負(fù)數(shù)則補(bǔ)1, 及補(bǔ)其符號位的數(shù))腌逢。

console.log(12 >> 2) // 3
console.log(12 >> 4) // 0
// 3 -> 0011 運(yùn)算結(jié)果為 1100 -> 12

就結(jié)果而言, 右移運(yùn)算符 << 便是 a 除以 2 的 b 次方, 若 2 的 b 次比 a 要大, 結(jié)果最小為 0

此時會有小伙伴問了, 普通整型是只有32位的, 如果 b 的值大于32或者小于0會怎么運(yùn)算啊

那我們不妨來試試

console.log(4 << 34) // 16

4 向左移位34位照理來說已經(jīng)超出了原位數(shù), 但是輸出結(jié)果為16相當(dāng)于左移兩位 34 - 32 = 2,
說到這應(yīng)該明白了吧, 不過不清楚是走過了循環(huán)還是運(yùn)行js的引擎自動將b%32

console.log(4 << -30) // 16

其實(shí)看到這里也大概知道左移負(fù)數(shù)位的規(guī)則了吧, -30 + 32 = 2, 同樣也是4 << 2 = 16

不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算

如果兩個不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算時降淮,系統(tǒng)會將二者按右端對齊,然后進(jìn)行位運(yùn)算搏讶。

我們知道在C語言(此處拿C舉例, 畢竟JS沒有l(wèi)ong int之分..)中l(wèi)ong型占4個字節(jié)佳鳖,int型占2個字節(jié),如果一個long型數(shù)據(jù)與一個int型數(shù)據(jù)進(jìn)行“與”運(yùn)算媒惕,
右端對齊后系吩,左邊不足的位依下面三種情況補(bǔ)足,

  • 如果整型數(shù)據(jù)為正數(shù)妒蔚,左邊補(bǔ)16個0穿挨。
  • 如果整型數(shù)據(jù)為負(fù)數(shù)月弛,左邊補(bǔ)16個1。
  • 如果整形數(shù)據(jù)為無符號數(shù)科盛,左邊也補(bǔ)16個0帽衙。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贞绵,隨后出現(xiàn)的幾起案子厉萝,更是在濱河造成了極大的恐慌,老刑警劉巖榨崩,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴垫,死亡現(xiàn)場離奇詭異,居然都是意外死亡母蛛,警方通過查閱死者的電腦和手機(jī)弹渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溯祸,“玉大人肢专,你說我怎么就攤上這事〗垢ǎ” “怎么了博杖?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筷登。 經(jīng)常有香客問我剃根,道長,這世上最難降的妖魔是什么前方? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任狈醉,我火速辦了婚禮,結(jié)果婚禮上惠险,老公的妹妹穿的比我還像新娘苗傅。我一直安慰自己,他們只是感情好班巩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布渣慕。 她就那樣靜靜地躺著,像睡著了一般抱慌。 火紅的嫁衣襯著肌膚如雪逊桦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天抑进,我揣著相機(jī)與錄音强经,去河邊找鬼。 笑死寺渗,一個胖子當(dāng)著我的面吹牛匿情,可吹牛的內(nèi)容都是我干的兰迫。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼码秉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸡号?” 一聲冷哼從身側(cè)響起转砖,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲸伴,沒想到半個月后府蔗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汞窗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年姓赤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仲吏。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡不铆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裹唆,到底是詐尸還是另有隱情誓斥,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布许帐,位于F島的核電站劳坑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏成畦。R本人自食惡果不足惜距芬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望循帐。 院中可真熱鬧框仔,春花似錦、人聲如沸拄养。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衷旅。三九已至捐腿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柿顶,已是汗流浹背茄袖。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘁锯,地道東北人宪祥。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓聂薪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝗羊。 傳聞我的和親對象是個殘疾皇子藏澳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350