摘要:將任一數值與執行按位與操作,其結果都為。中應用判斷奇偶性偶數奇數按位異或規則每一位都不同,結果才為將任一數值與進行異或操作,其結果為。
位運算在算法中很有用,速度可以比四則運算快很多。
To2orTo10JS中十進制轉二進制: (val).toString(2)
JS中二進制轉十進制: parseInt(val, 2)
JS中規定安全整數的范圍是-2^53~2^53,所以大于9007199254740991的數進制轉換會存在精度問題
讀取的十進制是根據原碼來讀取,而在內存中,數值都是以二進制補碼形式保存的
十進制-5的二進制表示為:1000,0101(原碼)
原碼除符號位外,全部取反再+1:11111011(補碼,內存存儲形式)
~-5的結果:
正數的補碼和原碼一樣
負數原碼補碼轉換規則:
符號位不動,從低位往高位數,遇到第一個1之前,包括第一個1不作任何取反,之后,每位都取反。避免了原碼轉反碼再轉補碼的繁瑣。
{原碼符號位不變} + {數值位按位取反后+1}
{原碼符號位不變} + {數值位從右邊數第一個1及其右邊的0保持不變,左邊安位取反}
// 7 00000111 // 原碼 00000111 // 補碼 // -6 10000110 // 原碼 11111010 // 補碼 // {原碼符號位不變} + {數值位從右邊數第一個1及其右邊的0保持不變,左邊安位取反} // -6 10000110 // 原碼 11111001 // 反碼 11111010 // 補碼 // {原碼符號位不變} + {數值位按位取反后+1}
進行按位操作,都是針對補碼去操作。
十進制轉二進制
1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000
64 64 / 2 = 32 -> 0 32 / 2 = 16 -> 0 16 / 2 = 8 -> 1000 // 轉為二進制為:100000 // 十進制 33 可以看成是 32 + 1 ,并且 33 應該是六位二進制的(因為 33 近似 32,而 32 是 2 的五次方,所以是六位),那么 十進制 33 就是 100001 ,只要是 2 的次方,那么就是 1否則都為 0
二進制轉十進制
二進制100001同理,首位是2^5(1) ,末位是2^0(0),相加得出33(只要是 2 的次方,那么就是 1否則都為 0)
按位非(~) 取反將1(原碼)轉二進制: 00000001
按位取反: 11111110
將符號位之外的其它數字取反[符號位(即最高位)為1(表示負數)]: 10000001
末位加1取其補碼: 10000010
轉換會十進制: -2
00000001 // 原碼 11111110 // 按位取反 10000001 // 除符號位取反 10000010 // +1
對任一數值 x 進行按位非操作的結果為 -(x + 1), 例如:2 -> -3
JS中的作用是配合indexOf():
indexOf找到一個給定元素的第一個索引,如果不存在,則返回-1, -1取反操作等于0,其它取反操作不等于0
if (~arr.indexOf(v)) if (arr.includes(v)) if (~str.indexOf(v)) if (str.indexOf(v) !== -1)按位或(|)
規則:其中一位為 1,結果就是 1
8 | 7 00001000 00000111 ---------- 00001111 // 15
任一數值 x 與 0 進行按位或操作,其結果都是 x:
6 | 0 00000110 00000000 --------- 00000110 // 6
任一數值 x 與 -1 進行按位或操作,其結果都為 -1:
6 | -1 00000110 10000001 --------- 10000111
將任一數值 x 與 0 進行按位或操作,其結果都是 x。將任一數值 x 與 -1 進行按位或操作,其結果都為 -1
JS中向下取整Math.floor, 返回小于或等于一個給定數字的最大整數
num | 0 or Math.floor(num)
Math.floor(45.95); // 45.95 | 0 // 45 Math.floor(45.05); // 45.05 | 0 // 45 Math.floor(4); // 4 | 0 // 4 Math.floor(-45.05); // -45.05 | 0 // -46 Math.floor(-45.95); // -45.95 | 0 // -46
1 | 0 ; // 1 1.1 | 0 ; // 1 "asfdasfda" | 0 ; // 0 0 | 0 ; // 0 (-1) | 0 ; // -1 (-1.5646) | 0 ; // -1 [] | 0 ; // 0 ({}) | 0 ; // 0 "123456" | 0 ; // 123456 1.23E2 | 0; // 123 1.23E12 | 0; // 1639353344 -1.23E2 | 0; // -123 -1.23E12 | 0; // -1639353344按位與(&)
規則:每一位都為 1,結果才為 1
8 & 7 // 0 00001000 00000111 00000000 // 0
將任一數值 x 與 0 執行按位與操作,其結果都為 0。將任一數值 x 與 -1 執行按位與操作,其結果都為 x。
JS中應用:
判斷奇偶性
10 & 1 // 0 偶數 11 & 1 // 1 奇數按位異或 (^)
規則:每一位都不同,結果才為 1
8 ^ 7 // 15 1000 0111 1111 // 15 8 ^ 8 // 0 1000 1000 0000 // 0
將任一數值 x 與 0 進行異或操作,其結果為 x。將任一數值 x 與 -1 進行異或操作,其結果為-x
不進位加法:
根據按位異或的特性就是不進位加法: 8 ^ 8 = 0 如果進位了,就是 16 了,所以只需要將兩個數進行異或操作,然后進位。那么也就是說兩個二進制都是1的位置,左邊應該有一個進位1
JS中應用:
交換二個數值
let a = 3 let b = 4 a ^= b b ^= a a ^= b有符號右移 (>>)
將第一個操作數向右移動指定的位數,向右被移出的位被丟棄,正數則在高位補零,負數則補1
9 >> 2 00001001 // 移動二位, 以0填充 00000010 // 2 -9 >> 2 10001001 // 原碼 11110111 // 補碼 11111101 // 補碼右移 10000011 // 原碼 // -3
公式:int v = a / (2 ^ b)
JS中的應用:
任何小數 把它>> 0可以取整
9.99 >> 0 // 9 9 >> 0 // 9 9.19 >> 0 // 9
除法運算:
9 >> 1 // 4 8 >> 1 // 4
二分算法中取中間值:
13 >> 1 // 6 12 >> 1 // 6topic
兩個數不使用四則運算得出和
a + b = (a ^ b) + ((a & b) << 1)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100460.html
摘要:總結對于原二進制數來說,是不變,是反轉。的位數對應原二進制數的位數,對各位進行屏蔽,全部置。左移左移與右移比較類似,是將目標二進制數字向左右移動相應的位數。語言中的邏輯運算符按位與,按位或,按位異或,取反,左右移位不完全手冊立創開源 ...
摘要:有符號的右移操作符由兩個大于符號表示這個操作符的含義就是將數值的位向右移指定的位數同時保留符號位的值正負號標記有符號的右移操作符與左移操作符剛好相反比如向右移動位就是同樣的在移位的過程中也會出 位操作符的基本概念 因為ECMAscript中所有數值都是以IEEE-75464格式存儲,所以才會誕生了位操作符的概念. 位操作符作用于最基本的層次上,因為數值按位存儲,所以位操作符的作用也就是...
摘要:例如,十進制數,用二進制表示則為。按位操作符操作數字的二進制形式,但是返回值依然是標準的數值。不同為真相同為假二進制按位異或運算從左到右按位非為真,為假對每一項進行非操作,遇真則假,遇假則真。 二進制與十六進制 二進制用 0 1 表示 2= 10十六進制 前綴0x 用0123456789ABCDEF表示 2= 0x2二進制與十六進制的轉換十六進制的每位 等于二進制的四位 十六進制 0x...
閱讀 2345·2023-04-25 14:29
閱讀 1477·2021-11-22 09:34
閱讀 2715·2021-11-22 09:34
閱讀 3398·2021-11-11 10:59
閱讀 1864·2021-09-26 09:46
閱讀 2238·2021-09-22 16:03
閱讀 1929·2019-08-30 12:56
閱讀 486·2019-08-30 11:12