位運算的常用操作總結

2021-07-14 05:59:01 字數 2415 閱讀 5419

位運算是乙個神奇的運算,可以很巧妙的解決一些難題,同時速度還非常快。下面將介紹位運算基本的概念,以及位運算的一些常用方法。

來自谷歌。

這裡需要注意的是,位運算的時候全部都是換算成二進位制的,一般都是32位的長度。

2.1 交換兩個數

int x = 1, y = 2;

x ^= y;

y ^= x;

x ^= y;

2.2 判斷乙個數是不是2的冪次判斷乙個數是不是2的冪次,要分析2的次冪的數的二進位制表示中,必然只有乙個1,其餘的都是0,要記住這個性質。而且n&(n-1)這也是乙個重要的性質,可以實現把n的最右邊的1變成0。

public

static

boolean

mici(int a)

2.3 求乙個數的絕對值對於負數可以採用通過對其取反後加1來得到正數。首先是向右移動31位,如果是正數就會得到0,如果是負數就是得到-1,對於正數可以直接輸出,對於負數可以取反加1。

int i=-1;

int j=i>>31;

return (i^j)-j;

2.4 求乙個數的相反數可以使用取反操作,但需要注意的是取反之後要加1。

int a=-1;

int b=~a+1;

2.5 判斷乙個數的奇偶性只需要和1進行與操作即可,因為乙個奇數的二進位制表示中1的個數肯定是偶數,而乙個偶數的的二進位制表示中1的個數肯定是奇數個。

int a=9;

return (a&1)==1;

2.6 、實現加法運算異或操作可以實現無進製的加法,要實現進製操作的話,需要有乙個進製變數記錄是否進製。

public

static

intgetsum(int a, int b)

return a;

}

2.7 實現減法

//實現減法 a-b

public

static

intjianfa(int a,int b)

2.7、實現正數的乘法原理上還是通過加法計算。將b個a相加。

public

static

intmulti(int a, int b)

a = a << 1;

b = b >> 1;

}return ans;

}

2.8、實現正數除法本質上還是進行的減法操作,看看,除數可以減去多少次被除數。

//實現正數除法

public

static

intdivide(int a,int b)

return res;

}

2.9、統計乙個數的二進位制表示中有多少個1使用的性質就是乙個數和這個數減去1相與的話實現的效果就是把二進位制表示中的最後乙個1變為0。這樣就可以統計次數了,也就是1的個數。

public

int hammingweight(int n)

return

sum;

}

2.10、查詢序列中只出現一次的數,其餘的數出現了2次乙個數和自己異或操作就是0,這樣就可以找出來,需要知道性質就是a^b^c=a^c^b

public

intsinglenumber(int nums)

2.11、反轉二進位制序列,然後輸出整數原數不斷右移一位,然後取出最低位賦給新數的最低位,然後新數左移移位。

private

static

intrever(int a)

return res;

}

2.12、實現兩個數的平均數

int a=1;

int b=9;

return (a+b)>>1;

C C 中常用位運算總結

大佬些就常用這些啊!總結一下總會用到的 inline int ind int xcell,int ycell,int zcell const 1 如果兩個相應的二進位制位都為 則該位的結果值為1 否則為0 比較實用的例子 比如我們經常要用的是否被2整除,一般都寫成 if n 2 0 可以換成 if ...

常用的位運算

1 按位與 0 0 0 0 1 0 1 0 0 1 1 1 同時為1則結果為1,否則為0 如3 8 3 00000011 5 00000101 結果為 00000001 2 按位或 0 0 0 0 1 1 1 0 1 1 1 1 兩個數中只要有乙個為1,則結果為1 同時為0 則結果為0 3 異或 兩...

常用位運算

檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...