1. 程式人生 > >簡單位運算及對一些小操作的理解

簡單位運算及對一些小操作的理解

一、位運算分類

  1. and,稱為“與”,通常用“&”表示。取值規則:兩者均為真的時候,返回真值。
  2. or,稱為“或”,通常用“|” 表示。取值規則:兩者中只要有一方為真的時候,返回值則為真。
  3. xor,稱為“異或”,通常用“^”表示。取值規則:兩個數值取值不同,返回值為真。如 1^0 =1
  4. 取非,通常用“~”表示,取值規則:需要按照位運算進行取值,分為正數與負數兩種。
  5. shl,稱為“左移”,通常用“<<”表示,資料向左移動,低位補0;
  6. 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畫圖的有趣部分~~ 加油呀~