簡單位運算及對一些小操作的理解
一、位運算分類
- and,稱為“與”,通常用“&”表示。取值規則:兩者均為真的時候,返回真值。
- or,稱為“或”,通常用“|” 表示。取值規則:兩者中只要有一方為真的時候,返回值則為真。
- xor,稱為“異或”,通常用“^”表示。取值規則:兩個數值取值不同,返回值為真。如 1^0 =1
- 取非,通常用“~”表示,取值規則:需要按照位運算進行取值,分為正數與負數兩種。
- shl,稱為“左移”,通常用“<<”表示,資料向左移動,低位補0;
- shr,稱為“右移”,通常用“>>”表示,資料向右移動,高位補0,(此時區分情況,原始資料為整數則補0,為負數則補1
- 注意點:均化為二進位制進行操作,注意負數的操作,下面會寫到。
- 位操作與邏輯操作不同,不要混淆兩者概念。&不等&&。|不等||。
- 不同長度的位運算,右對齊後進行操作。
二、位運算一些小理解
1.and操作符(&):
- 注意當原始資料是負數的時候,對負數的補碼進行位運算,注意負數的補碼的符號位不變。
- 可以用來指定位置的清零運算
x=11001,想要把資料中的“1“ ---”0“,設進行與操作的數值為y,x中需要清零位的位置,在y中對應為0,再進行與操作,即可。x=11001,y=00110,x&y=00000。 可以說明,x取反為y,x&y即可,用於指定位置清零
- 取一個數中的指定位:可以是連續的,也可以是不連續的
x=11001,需要把第二個”1“取出來,設為y,x中需要取出的資料位在y中對應位為”1“,其餘位為”0“兩者再進行與操作。
x=11001,y=01000,x&y=01000;
2. or操作符(|):
- 負數進行或操作,轉換為補碼進行運算,注意符號位不變。
- 可以用來將某些元素的對應位,進行置”1“運算。
x=10100000 設y,y是將x中 需要置”1“的位的對應位為”1“,其餘為”0“,再進行或操作
y=10101111,x|y=10101111.
3.xor異或(^):
- 異或具有交換律、結合律的性質。 兩次異或,結果為自己本身,x^x=0,x^0=x;
- 用於x中對應位的資料的翻轉。
設y,將x中要翻轉的資料位設定為1,其餘為0,再y^x 即可
x=10110100, y=10110000,x^y=00000100,前面幾位對應翻轉。
- x^y^y=x^0=x 異或的自反性,用於求多項式,或者是交換兩元素的內容。
a=a^b;
b=a^b=a^b^b=a;
a=a^b=a^b^a=b
- 經典題型:1-1000,中含有1001個元素,這組陣列中有唯一的重複的元素,其餘資料只出現一次,請找出這個資料。
方法一:所有資料(1001個)相加減去(1+2....+1000),即可得到重複的資料。
方法二:將所有資料進行異或運算1^2^3^4....^1000,再異或的過程中利用了異或的自反性,對應消除為0,剩下來的,對應就是所重複的資料。
4.取非(~)
取非分為正數和負數,兩者取非的方式不同。
- 正數取非:原始資料取反(此時符號位要變),再取反碼的補碼,此時注意符號位不變。
x=0100 0000 1 -------1011 1111 0 -------1100 0001 0 補碼=反碼+1
- 負數取非:原始資料取補碼(取反加1),再取反碼(前面的補碼的符號位不變再取此時的反碼)
x=1100 0001 0-----0011 1111 0-----0010 0000 1
- 正數取非= -(正數+1)
- 負數取非= -(負數+1)
5.shl左移(<<)
向左移動,低位補零,移動一位是原始資料的2倍,移動n位,是原始資料2^n倍,一般用於快速計算2的倍數,用左移。左移有一定機率改變資料的正負行,取決於符號位是否被移除。
例:5=0000 0101<<1 = 0000 1010=10
5=0000 0101<<2 = 0001 0100 =20
6.shr右移(>>)
注意正負數的區別,整數高位補0,負數高位補1。移動n位,是原始資料除以2^n倍.8>>3 =8/2^3.
例子如上。
ps:以上是簡單的操作,後期補上在js中的運用,有可能會後面一些,接下去還有一篇不用css改變checkbox樣式,以及css3畫圖的有趣部分~~ 加油呀~