位運算的基礎知識整理

2021-10-07 22:58:07 字數 2799 閱讀 5749

&(按位與):如果兩個相應的二進位制位都為1,則結果為1,否則結果為0。

|(按位或):兩個相應的二進位制位中只要有乙個為1,則結果為1,否則結果為0。

^(按位異或):若參加運算的兩個二進位制位值相同,則結果為0,否則結果為1。

~(取反):對乙個二進位制數按位取反,即將0變為1,將1變為0。

<<(左移):用來將乙個數的各二進位制位全部左移n位,右邊補0。

>>(右移):用來將乙個數的各二進位制位全部右移n位,移到右邊的低位捨棄,對於無符號的數,高位補0;對於有符號的數,如果原符號位(即最高位)為1,則高位補1,如果原符號位為0,則高位補0。

判斷奇偶數

如果把n以二進位制的形式展示的話,判斷奇偶數隻需要判斷最後乙個二進位制位是0還是1就可以了,如果是1則為奇數,否則為偶數。

int n =5;

if((n &1)

==1)

交換兩個數的值

由上述^運算的定義可知,x^x=0,xyz=xzy,n^0=n,則可據此在不使用輔助變數的前提下交換兩個數的值。

int x =5;

int y =9;

x = x ^ y;

//y=(x^y)^y=x^(y^y)=x^0=x;

y = x ^ y;

//x=(x^y)^x=(x^x)^y=0^y=y;

x = x ^ y;

system.out.

println

("x="

+ x +

";y="

+ y)

;//輸出結果:x=9;y=5

找出沒有重複的數

適用場景:給出一組整數,其中乙個數隻出現了一次,其他的數都出現了兩次,讓找出這個只出現了一次的數。

由上述運算的定義可知,xx=0,xyz=xzy,n0=n,則將所有的數一起做,出現了兩次的數都會被消掉。

int

arr =

;int tmp = arr[0]

;for

(int i =

1; i < arr.length; i++

) system.out.

println

(tmp)

;//輸出結果:5

m的n次方

根據&1和》1的性質,我們可以逐位讀取n,例如13的二進位制1101=1000+0100+0001=2³+2²+2º。

/**

* @description: 測試類

* @author: murphy

* @date: 2020/7/37:44 上午

*/public

class

demo

/** * 計算m的n次方的值

* @author murphy

* @date 2020/7/10-12:10 上午

* @param m

* @param n

* @return int

*/public

static

intpow

(int m,

int n)

tmp *= tmp;

n = n >>1;

}return sum;

}}

使用二進位制進行子集列舉

乙個元素個數為n的集合,子集有2的n次方個;在二進位制中,如果用二進位制的第i位是1還是0來表示集合的第i位元素取還是不取,那麼n個二進位制位共有2的n次方種組合方式,且這些組合方式恰好是0到n的2次方減1的二進位制的值。因此,可以根據這種性質用二進位制進行子集列舉,大致思路如下:

arr=

;000→

;001→

;010→

;011→

;100→

;101→

;110→

;111→

;

實現**如下:

/**

* @description: 測試類

* @author: murphy

* @date: 2020/7/37:44 上午

*/public

class

demo

/** * 計算m的n次方的值

* @author murphy

* @date 2020/7/10-12:10 上午

* @param m

* @param n

* @return int

*/public

static

intpow

(int m,

int n)

tmp *= tmp;

n = n >>1;

}return sum;

}/**

* 列出集合arraylist的所有子集並輸出

* @author murphy

* @date 2020/7/10-1:12 上午

* @param arraylist

* @return void

*/public

static

void

enumeration

(arraylist

arraylist)

initial = initial >>1;

a +=1;

} system.out.

println

(arr)

; initial +=1;

}}}

位運算基礎知識

位運算子主要針對二進位制,它包括了 與 非 或 異或 從表面上看似乎有點像邏輯運算子,但邏輯運算子是針對兩個關係運算子來進行邏輯運算,而位運算子主要針對兩個二進位制數的位進行邏輯運算。下面詳細介紹每個位運算子。1 與運算子 與運算子用符號 表示,其使用規律如下 兩個運算元中位都為1,結果才為1,否則...

位運算的基礎知識

位運算常見符號 我只會這麼多 舉例均為二進位制 與運算子 兩位同時為 1 結果才為 1 否則為0 例 1 0 0 0 0 0 1 1 1 110 111 110 或運算子 參加運算的兩個物件只要有乙個為1,其值為1 例 1 1 1 1 0 1 0 0 0 110 111 111 異或 同為0,異為1...

位運算知識整理

位運算操作符 位邏輯非運算 位邏輯與運算 位邏輯或運算 位邏輯異或運算 位左移運算 位右移運算using system using system.collections.generic using system.linq using system.text namespace 集合 renum 如果...