新四季網

js查看字符二進位(JS二進位位運算符)

2023-04-13 11:32:38 1

js查看字符二進位?二進位位運算符用於直接對二進位位進行計算,一共有7個,下面我們就來說一說關於js查看字符二進位?我們一起去了解並探討一下這個問題吧!

js查看字符二進位

概述

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

二進位或運算符(or):符號為|,表示若兩個二進位位都為0,則結果為0,否則為1。二進位與運算符(and):符號為&,表示若兩個二進位位都為1,則結果為1,否則為0。二進位否運算符(not):符號為~,表示對一個二進位位取反。異或運算符(xor):符號為^,表示若兩個二進位位不相同,則結果為1,否則為0。左移運算符(left shift):符號為<>,詳見下文解釋。頭部補零的右移運算符(zero filled right shift):符號為>>>,詳見下文解釋。

這些位運算符直接處理每一個比特位(bit),所以是非常底層的運算,好處是速度極快,缺點是很不直觀,許多場合不能使用它們,否則會使代碼難以理解和查錯。

有一點需要特別注意,位運算符只對整數起作用,如果一個運算子不是整數,會自動轉為整數後再執行。另外,雖然在 JavaScript 內部,數值都是以64位浮點數的形式儲存,但是做位運算的時候,是以32位帶符號的整數進行運算的,並且返回值也是一個32位帶符號的整數。

i = i | 0;

上面這行代碼的意思,就是將i(不管是整數或小數)轉為32位整數。

利用這個特性,可以寫出一個函數,將任意數值轉為32位整數。

function toInt32(x) { return x | 0;}

上面這個函數將任意值與0進行一次或運算,這個位運算會自動將一個值轉為32位整數。下面是這個函數的用法。

toInt32(1.001) // 1toInt32(1.999) // 1toInt32(1) // 1toInt32(-1) // -1toInt32(Math.pow(2, 32) 1) // 1toInt32(Math.pow(2, 32) - 1) // -1

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

二進位或運算符

二進位或運算符(|)逐位比較兩個運算子,兩個二進位位之中只要有一個為1,就返回1,否則返回0。

0 | 3 // 3

上面代碼中,0和3的二進位形式分別是00和11,所以進行二進位或運算會得到11(即3)。

位運算只對整數有效,遇到小數時,會將小數部分捨去,只保留整數部分。所以,將一個小數與0進行二進位或運算,等同於對該數去除小數部分,即取整數位。

2.9 | 0 // 2-2.9 | 0 // -2

需要注意的是,這種取整方法不適用超過32位整數最大值2147483647的數。

2147483649.4 | 0;// -2147483647

二進位與運算符

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

0 & 3 // 0

上面代碼中,0(二進位00)和3(二進位11)進行二進位與運算會得到00(即0)。

二進位否運算符

二進位否運算符(~)將每個二進位位都變為相反值(0變為1,1變為0)。它的返回結果有時比較難理解,因為涉及到計算機內部的數值表示機制。

~ 3 // -4

上面表達式對3進行二進位否運算,得到-4。之所以會有這樣的結果,是因為位運算時,JavaScript 內部將所有的運算子都轉為32位的二進位整數再進行運算。

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

~ -3 // 2

上面表達式可以這樣算,-3的取反值等於-1減去-3,結果為2。

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

~~3 // 3

所有的位運算都只對整數有效。二進位否運算遇到小數時,也會將小數部分捨去,只保留整數部分。所以,對一個小數連續進行兩次二進位否運算,能達到取整效果。

~~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函數將字符串轉為數值的規則,參見《數據的類型轉換》一章。

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

// 相當於 ~Number([])~[] // -1// 相當於 ~Number(NaN)~NaN // -1// 相當於 ~Number(null)~null // -1

異或運算符

異或運算(^)在兩個二進位位不同時返回1,相同時返回0。

0 ^ 3 // 3

上面表達式中,0(二進位00)與3(二進位11)進行異或運算,它們每一個二進位位都不同,所以得到11(即3)。

「異或運算」有一個特殊運用,連續對兩個數a和b進行三次異或運算,a^=b; b^=a; a^=b;,可以互換它們的值。這意味著,使用「異或運算」可以在不引入臨時變量的前提下,互換兩個變量的值。

var a = 10;var b = 99;a ^= b, b ^= a, a ^= b;a // 99b // 10

這是互換兩個變量的值的最快方法。

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

12.9 ^ 0 // 12

左移運算符

左移運算符(<<)表示將一個數的二進位值向左移動指定的位數,尾部補0,即乘以2的指定次方。向左移動的時候,最高位的符號位是一起移動的。

// 4 的二進位形式為100,// 左移一位為1000(即十進位的8)// 相當於乘以2的1次方4 << 1// 8-4 << 1// -8

上面代碼中,-4左移一位得到-8,是因為-4的二進位形式是11111111111111111111111111111100,左移一位後得到11111111111111111111111111111000,該數轉為十進位(減去1後取反,再加上負號)即為-8。

如果左移0位,就相當於將該數值轉為32位整數,等同於取整,對於正數和負數都有效。

13.5 << 0// 13-13.5 << 0// -13

左移運算符用於二進位數值非常方便。

var color = {r: 186, g: 218, b: 85};// RGB to HEX// (1 << 24)的作用為保證結果是6位數var rgb2hex = function(r, g, b) { return '#' ((1 << 24) (r << 16) (g <>)表示將一個數的二進位值向右移動指定的位數。如果是正數,頭部全部補0;如果是負數,頭部全部補1。右移運算符基本上相當於除以2的指定次方(最高位即符號位參與移動)。

4 >> 1// 2/*// 因為4的二進位形式為 00000000000000000000000000000100,// 右移一位得到 00000000000000000000000000000010,// 即為十進位的2*/-4 >> 1// -2/*// 因為-4的二進位形式為 11111111111111111111111111111100,// 右移一位,頭部補1,得到 11111111111111111111111111111110,// 即為十進位的-2*/

右移運算可以模擬 2 的整除運算。

5 >> 1// 2// 相當於 5 / 2 = 221 >> 2// 5// 相當於 21 / 4 = 521 >> 3// 2// 相當於 21 / 8 = 221 >> 4// 1// 相當於 21 / 16 = 1

頭部補零的右移運算符

頭部補零的右移運算符(>>>)與右移運算符(>>)只有一個差別,就是一個數的二進位形式向右移動時,頭部一律補零,而不考慮符號位。所以,該運算總是得到正值。對於正數,該運算的結果與右移運算符(>>)完全一致,區別主要在於負數。

4 >>> 1// 2-4 >>> 1// 2147483646/*// 因為-4的二進位形式為11111111111111111111111111111100,// 帶符號位的右移一位,得到01111111111111111111111111111110,// 即為十進位的2147483646。*/

這個運算實際上將一個值轉為32位無符號整數。

查看一個負整數在計算機內部的儲存形式,最快的方法就是使用這個運算符。

-1 >>> 0 // 4294967295

上面代碼表示,-1作為32位整數時,內部的儲存形式使用無符號整數格式解讀,值為 4294967295(即(2^32)-1,等於11111111111111111111111111111111)。

開關作用

位運算符可以用作設置對象屬性的開關。

假定某個對象有四個開關,每個開關都是一個變量。那麼,可以設置一個四位的二進位數,它的每個位對應一個開關。

var FLAG_A = 1; // 0001var FLAG_B = 2; // 0010var FLAG_C = 4; // 0100var FLAG_D = 8; // 1000

上面代碼設置 A、B、C、D 四個開關,每個開關分別佔有一個二進位位。

然後,就可以用二進位與運算,檢查當前設置是否打開了指定開關。

var flags = 5; // 二進位的0101if (flags & FLAG_C) { // ...}// 0101 & 0100 => 0100 => true

上面代碼檢驗是否打開了開關C。如果打開,會返回true,否則返回false。

現在假設需要打開A、B、D三個開關,我們可以構造一個掩碼變量。

var mask = FLAG_A | FLAG_B | FLAG_D;// 0001 | 0010 | 1000 => 1011

上面代碼對A、B、D三個變量進行二進位或運算,得到掩碼值為二進位的1011。

有了掩碼,二進位或運算可以確保打開指定的開關。

flags = flags | mask;

上面代碼中,計算後得到的flags變量,代表三個開關的二進位位都打開了。

二進位與運算可以將當前設置中凡是與開關設置不一樣的項,全部關閉。

flags = flags & mask;

異或運算可以切換(toggle)當前設置,即第一次執行可以得到當前設置的相反值,再執行一次又得到原來的值。

flags = flags ^ mask;

二進位否運算可以翻轉當前設置,即原設置為0,運算後變為1;原設置為1,運算後變為0。

flags = ~flags;

原文「連結」

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了