摘要:簡單了解位運(yùn)算簡單了解基礎(chǔ)位運(yùn)算符是在數(shù)字底層表示數(shù)字的個(gè)數(shù)位上進(jìn)行操作的。注意位的位置在最右側(cè)。諾,就是這樣的顯示就是這樣的位運(yùn)算符與兩個(gè)都為結(jié)果才為保持?jǐn)?shù)位對齊,用上述規(guī)則然后進(jìn)行與運(yùn)算。
簡單了解位運(yùn)算 簡單了解基礎(chǔ)
位運(yùn)算符是在數(shù)字底層(表示數(shù)字的32個(gè)數(shù)位)上進(jìn)行操作的。
所有整數(shù)字面量都是有符號整數(shù),用31位表示數(shù)值,用第32位表示符號,0表示正數(shù)1表示負(fù)數(shù)。數(shù)值范圍從-(2^31 - 1)到(2^31 - 1)。注意位0的位置在最右側(cè)。
0是所有位為0
-1是所有位為1
-2147483648是除了最左邊為1,其他都是0
2147483647是除了最左邊為0外,其他都是1的整數(shù)。
正數(shù)是以真二進(jìn)制形式存儲的,前 31 位中的每一位都表示 2 的冪,從第 1 位(位 0)開始,表示 2^0,第 2 位(位 1)表示 2^1。沒用到的位用 0 填充,即忽略不計(jì)。
var num = 18; (num).toString(2); //10010(18 = 2^4+2^1)
負(fù)數(shù)也存儲為二進(jìn)制代碼,不過采用的形式是二進(jìn)制補(bǔ)碼
直接來例子,求-18的補(bǔ)碼
(1)求該數(shù)字非負(fù)版本的二進(jìn)制。這里也就是18的二進(jìn)制(10010)
(2)求二進(jìn)制反碼,也就是1變成0,0變成1(1111 1111 1111 1111 1111 1111 1110 1101)
(3)在反碼的基礎(chǔ)上加一,注意二進(jìn)制里的運(yùn)算1+1=10(1111 1111 1111 1111 1111 1111 1110 1110)
但是呢,ECMAScript并不以這種二進(jìn)制補(bǔ)碼來表示負(fù)數(shù),而是用數(shù)字絕對值的標(biāo)準(zhǔn)二進(jìn)制代碼前面加上負(fù)號的形式輸出。
//諾,就是這樣 var num = -18; (num).toString(2); //-10010,“-18的顯示就是這樣的”位運(yùn)算符
與 & 兩個(gè)都為1 結(jié)果才為1
保持?jǐn)?shù)位對齊,用上述規(guī)則然后進(jìn)行與運(yùn)算。
或 | 兩個(gè)都為0時(shí),結(jié)果才為0
保持?jǐn)?shù)位對齊,用上述規(guī)則然后進(jìn)行或運(yùn)算。
非 ~ 0變1,1變0
其實(shí)就是對數(shù)字求負(fù),然后減一
var num = 25; var num1 = ~num; num1; //-26
異或 ^ 兩個(gè)相同為0,不同為1
滿足交換律,一個(gè)數(shù)和自己異或的結(jié)果是0,任何數(shù)x與0異或的結(jié)果都是本身x,任何數(shù)x與-1異或的結(jié)果都是-x。
左移 << 各二進(jìn)位全部左移若干位,高位丟棄,右側(cè)低位補(bǔ)0
var old = 2; //10 var new = old << 5; //1000000
右移 >> 各二進(jìn)位全部右移若干位,有符號數(shù),用符號位的值填充這些空位。
一些小技巧(1)判斷奇偶(貌似很實(shí)用啊)
//一般都是(i % 2 !== 0)來判斷奇數(shù) if(i & 1) { //奇數(shù)需要進(jìn)行的事情 } else { //偶數(shù)需要做的事情 }
(2)交換兩個(gè)數(shù)字
一般需要一個(gè)中間變量,
var temp = a; var a = b; var b = temp;
可以用位操作符實(shí)現(xiàn)交換不需要中間變量
a ^= b; //a = a ^ b b ^= a; //b = b ^ a = b ^ a ^ b = a (b = a) a ^= b; //a = a ^ b = a ^ b ^ a = b;
(3)變換符號
只需要求反后加1即可
function rever (n) { return ~n + 1; } //11 => -11
(4)求絕對值
對于負(fù)數(shù)對其取反后加1來得到正數(shù)。先移位取得符號位i >> 31
var i = a >> 31 //如果a為正數(shù),i為0。如果a為負(fù)數(shù),i為-1 return i == 0 ? a : (~a + 1); //正數(shù)保持不變,負(fù)數(shù)變換符號。
另一種方法
可以通過異或,參考異或的規(guī)則。a與i異或后減i(即加0或者加1)
var i = a >> 31; return (a ^ i) - i;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81977.html
摘要:將補(bǔ)數(shù)的概念用到計(jì)算機(jī)中,便出現(xiàn)了補(bǔ)碼這種機(jī)器數(shù)。通常,從原碼形式入手來求補(bǔ)碼。它與補(bǔ)碼的區(qū)別是末位少加一個(gè),因此很容易從補(bǔ)碼的定義推出反碼的定義。若真值為純小數(shù),它的反碼形式為其中表示符號位。 一、原碼表示法 原碼表示法是一種最簡單的機(jī)器數(shù)表示法,其最高位為符號位,符號位為0時(shí)表示該數(shù)為正,符號位為1時(shí)表示該數(shù)為負(fù),數(shù)值部分與真值相同。若真值為純小數(shù),它的原碼形式為Xs,.X1X2X...
摘要:將補(bǔ)數(shù)的概念用到計(jì)算機(jī)中,便出現(xiàn)了補(bǔ)碼這種機(jī)器數(shù)。通常,從原碼形式入手來求補(bǔ)碼。它與補(bǔ)碼的區(qū)別是末位少加一個(gè),因此很容易從補(bǔ)碼的定義推出反碼的定義。若真值為純小數(shù),它的反碼形式為其中表示符號位。 一、原碼表示法 原碼表示法是一種最簡單的機(jī)器數(shù)表示法,其最高位為符號位,符號位為0時(shí)表示該數(shù)為正,符號位為1時(shí)表示該數(shù)為負(fù),數(shù)值部分與真值相同。若真值為純小數(shù),它的原碼形式為Xs,.X1X2X...
摘要:二進(jìn)制本身就是為這個(gè)數(shù)字而使用的,所以說這道面試題直指二進(jìn)制的使用是沒錯(cuò)的。正負(fù)在二進(jìn)制中,第一位為的是負(fù)數(shù),是正數(shù)。 showImg(https://segmentfault.com/img/bVbd7d0?w=1580&h=732); 前言 使用PHP,給定一個(gè)數(shù),判斷這個(gè)數(shù)是否是二的N次方 這樣看似簡單的一個(gè)面試題, 實(shí)際牽出了很多基礎(chǔ)知識,本章在為大家補(bǔ)習(xí)基礎(chǔ)知識的情況下來解答...
摘要:位運(yùn)算符是對其操作數(shù)按其二進(jìn)制形式逐位進(jìn)行運(yùn)算。接下來我們逐一講解位運(yùn)算符的計(jì)算原理按位與用于清零取某些指定位保位的計(jì)算原理,,結(jié)果上面使用按位與的一段程序運(yùn)行結(jié)果為我們用二進(jìn)制來分析一下它的計(jì)算規(guī)則。 C語言中位運(yùn)算符共有六種 目錄 1.&(按位與) 2. |(按位或) 3.^(按位抑或)...
摘要:前言最近,朋友問了我這樣一個(gè)問題在中的運(yùn)算結(jié)果,為什么是這樣的雖然我告訴他說,這是由于浮點(diǎn)數(shù)精度問題導(dǎo)致的。由于可以用階碼移動小數(shù)點(diǎn),因此稱為浮點(diǎn)數(shù)。它的實(shí)現(xiàn)遵循標(biāo)準(zhǔn),使用位精度來表示浮點(diǎn)數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018981071); 前言 最近,朋友 L 問了我這樣一個(gè)問題:在 chrome 中的運(yùn)算...
閱讀 2780·2021-09-23 11:44
閱讀 1671·2021-09-13 10:24
閱讀 2619·2021-09-08 09:36
閱讀 1231·2019-08-30 15:54
閱讀 2248·2019-08-30 13:54
閱讀 3308·2019-08-30 10:57
閱讀 1844·2019-08-29 18:43
閱讀 3609·2019-08-29 15:10