JS中按位取反運算符~及其它運算符

~按位取反運算符

正常一個數(shù)字,例如12纲爸,或者-1-2阁危。

如果我們對它們進行按位取反的話,結果會是這樣:

  • ~1 = -2
  • ~2 = -3
  • ~-1 = 0
  • ~-2 = 1

看不懂沒關系亮瓷,讓我們來一步步看看實現(xiàn)的過程哈。

在這里其實是分了正數(shù)和負數(shù)的降瞳,因為符號不同取反的過程也會不同。

1.1 正數(shù)按位取反

先讓我們來看看正數(shù)的按位取反蚓胸。

比如先看看~1 = -2挣饥,過程如下:

1. 十進制轉為二進制原碼

首先將十進制的1轉化為二進制原碼為:0000 0001

2. 二進制原碼按位取反

之后將原碼按位取反:

也就是將0000 0001 => 1111 1110

(取反應該知道啥意思吧?就是0換成1沛膳,1換成0)

3. 取反后的二進制轉為原碼

再將取反后的二進制碼轉為原碼二進制:

也就是將1111 1110 => 1000 0010

這里你估計看著都點懵了扔枫,當我們將取反后的二進制轉為原碼二進制的時候,其實是有以下兩步的:

  1. 需要判斷取反后的二進制的第一個位是不是1锹安,這個第一位我們稱之為符號位短荐,如果是1的話就表示即將要轉成的數(shù)是一個負數(shù),如果是0的話表示即將要轉的數(shù)是一個正數(shù)叹哭,這個符號位是不能動的忍宋;在這里我們可以看到1111 1110的第一位是1,所以表示即將要轉的數(shù)是一個負數(shù)风罩,同時我們不動它糠排。
  2. 然后將除了第一位以外其它位數(shù)取反并+1。所以會有這么兩個過程:
    • 1111 1110 => 1000 0001
    • 1000 0001 => 1000 0010 (這步是對上一步的結果+1超升,因為上一步的最后一個數(shù)是1入宦,所以它再加上1就需要向前進一位了哺徊,因此變成了1000 0010)

4. 將原碼二進制轉為十進制

最后一步就是將我們前面得到的1000 0010這個二進制轉化為十進制了。

第一位符號位乾闰,是1落追,則表示是個負數(shù),所以結果為-2涯肩。

OK??轿钠,搞懂了這個步驟之后再讓我們自己來轉換一下~2 = -3吧:

1. 0000 0010
2. 1111 1101
3. 1000 0011
4. -3

正數(shù)按位取反總結

  1. 十進制轉為二進制原碼
  2. 二進制原碼按位取反
  3. 符號位保留,其余位取反+1
  4. 二進制原碼轉為十進制

1.2 負數(shù)按位取反

負數(shù)的按位取反和上面就有些不一樣了宽菜,主要是第二步和第三步調換一下順序:

  1. 十進制轉為二進制原碼
  2. 符號位保留谣膳,其余位取反+1
  3. 二進制原碼按位取反
  4. 二進制原碼轉為十進制

例如:~-1 =0的轉換過程:

1. 十進制轉為二進制原碼

這步和正數(shù)按位取反是一樣的:

-1 => 1000 0001

2. 符號位保留,其余位取反+1

轉換過程:

  • 1000 0001 => 1111 1110 (取反)
  • 1111 1110 => 1111 1111 (取反后 + 1)

3. 二進制原碼按位取反

將剛剛得到的再進行按位取反:

1111 1111 => 0000 0000

4. 二進制原碼轉為十進制

0000 0000 => 0

OK??铅乡,現(xiàn)在自己來轉換一下~-2 = 1吧:

1. 1000 0010
2. 1111 1110
3. 0000 0001
4. 1

這里沒啥訣竅继谚,關鍵就是要記住轉換的過程然后不斷的練習吧 ??。

~~雙非按位取反運算符

~~它代表雙非按位取反運算符阵幸,如果你想使用比Math.floor()更快的方法花履,那就是它了。它有這么兩個特點:

  • 非數(shù)字取值為0挚赊,它具體的表現(xiàn)形式為:
~~null;      // => 0
~~undefined; // => 0
~~Infinity;  // => 0
--NaN;       // => 0
~~0;         // => 0
~~{};        // => 0
~~[];        // => 0
~~(1/0);     // => 0
~~false;     // => 0
~~true;      // => 1

對比與Number()的好處就是Number(undefined)會轉換為NaN诡壁;但是使用~~能保證一直是數(shù)字。

  • 對于正數(shù)荠割,它向下取整妹卿;對于負數(shù),向上取整:
console.log(~~1.3) // 1
console.log(~~-1.3) // -1

Math.floor()的不同蔑鹦,Math.floor()都是向下取整:

console.log(Math.floor(1.3)) // 1
console.log(Math.floor(-1.3)) // -2
console.log(~~1.3) // 1
console.log(~~-1.3) // -1

|運算符

通常用來取整夺克,如:

1.2|0  // 1
1.8|0 // 1
-1.2|0 // -1

其它運算符

類似的還有:

<<左移,<<a 將a第一位丟棄嚎朽,后七位尾部加0

>>右移铺纽,>>a 將a末位丟棄,前七位開頭加0

& 或哟忍,a & b 將a和b中所有為1的位組成新值

^ 異狡门,a ^ b 將a和b中ab不同的位組(即其中一個為0且另一個為1,則為1锅很,兩個都為0或都為1其馏,則為0)成新值

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爆安,隨后出現(xiàn)的幾起案子尝偎,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致扯,死亡現(xiàn)場離奇詭異肤寝,居然都是意外死亡,警方通過查閱死者的電腦和手機抖僵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門鲤看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耍群,你說我怎么就攤上這事义桂。” “怎么了蹈垢?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵慷吊,是天一觀的道長。 經常有香客問我曹抬,道長溉瓶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任谤民,我火速辦了婚禮堰酿,結果婚禮上,老公的妹妹穿的比我還像新娘张足。我一直安慰自己触创,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布为牍。 她就那樣靜靜地躺著哼绑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碉咆。 梳的紋絲不亂的頭發(fā)上凌那,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音吟逝,去河邊找鬼。 笑死赦肋,一個胖子當著我的面吹牛块攒,可吹牛的內容都是我干的。 我是一名探鬼主播佃乘,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼囱井,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趣避?” 一聲冷哼從身側響起庞呕,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后住练,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體地啰,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年讲逛,在試婚紗的時候發(fā)現(xiàn)自己被綠了亏吝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡盏混,死狀恐怖蔚鸥,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情许赃,我是刑警寧澤止喷,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站混聊,受9級特大地震影響弹谁,放射性物質發(fā)生泄漏。R本人自食惡果不足惜技羔,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一僵闯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藤滥,春花似錦鳖粟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至标沪,卻和暖如春榄攀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背金句。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工檩赢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人违寞。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓贞瞒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趁曼。 傳聞我的和親對象是個殘疾皇子军浆,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355