位運算及應用

2022-08-18 12:06:14 字數 1901 閱讀 6430

位運算:

&與|或~非^異或

<< 左移,相當與*2

>> 右移,正數高位補0,負數由計算機決定

>>>右移,正數高位補0,負數亦補0

迴圈左移k次(x<> (32-k)),

迴圈右移k次(x>>k) | (x << (32-k))

清零取反要用與,某位置一可用或

若要取反和交換,輕輕鬆鬆用異或

應用:字元改變大小寫:

原理:小寫字元比對應的大寫字元在數值上大32, 而32 = 0010 0000=0x20

inline char lower(char c)

inline char upper(char c)

交換兩個數(字元),不用第三個變數就可以交換兩個變數的值了:

用異或^,原理:兩次異或能還原,即a = (a^b) ^ b

a = a^b; b = a^b; a = a^b;

當然不用位運算,也可以實現不用第三個變數交換兩個數(可能資料溢位)。

a = a+b; b = a-b; a = a-b;

判斷乙個數是不是

2的冪次:

原理:2的冪次的二進位制表示中只有一位是1,其他位為0

x = x&(x-1)是讓x的二進位製碼最右側的1置為0,如果結果為0就表示原先x只有1位是1,其他位為0

inline bool is2pow(int x)

inline bool is2pow(int x)

//4的倍數:二進位制表示中只有一位為1的,而且此位為從右數的奇數字

int pow4(int n)

8的冪次: (n!=0) &&(n&(n-1)==0) && (n%7==1)

16的冪次:(n!=0) &&(n&(n-1)==0) && (n%15==1)

32的冪次:(n!=0) &&(n&(n-1)==0) && (n%31==1) 

求乙個整數有多少位是

0:原理同上。用

x&(x-1)

二進位制快速求冪:

判斷奇偶數:

原理:奇數最後一位為1

,偶數為

0inline bool odd(int x)

inline bool even(int x)

n%2 = n&1

n%4 = n&3

n%8 = n&7……求

x絕對值:

原理:x為正數

時不做改變,

為負數時取反加1x

為正數時y = 0 = 0000 0000 0000 0000x為負

數時y = -1 = 1111 1111 1111 1111跟0

異或是本身,跟

1異或是取反對2

的冪次取模:

原理:x&y取出x

和y二進位制位

1的所有位。

x^y>>1

取出x,y

只有乙個二進位制位

1的並除以

2return (x&y) +

(x^y)>>1);

不用位運算時注意

(x+y)/2,

有可能會溢位。

x向上取整到

y,其中

y=2^n (

位元組對齊用

):#define

rund(x,y) ( ((x)+(y)-1)&~((y)-1) )

其他:只有第k位

為1的數1 << (k

-1)後

k位為均為1的數

(1<

x 的第k+1

位x >> k&1

x的第k+1

位置1:x >> k |(1 << k)x的第

k+1位置0:

x >> k &~(1 << k)

注意:左移

1位再右移

1位不一定

時原先的

位運算及簡單應用

老實說,我對 一些比較簡單的運算子比較熟悉。對位運算就陌生了,主要用的少。我覺得高手用的會比較多,因為位運算速度比較快。1.如果兩個相應的二進位制位都為 則該位的結果值為1 否則為0。注 下面都用8位的 unsigned char 來做例子。11 3 3 00001011 00000011 0000...

位運算基礎及簡單應用

程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。含義c語言 操作按位與 a b 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0 按位或a b 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1 按位異或 a b 若參加運...

位運算應用

位運算 針對整型 字元型,計算機會將它轉換為二進位制運算 1 按位與 x y 對應位都為1時才為1 用途 取 保留1個數的某位 對應掩碼的對應位為1 其餘各位置1 2 按位或 x y 對應位都為0才為0,否則為1 用途 將1個數的某些位置1,其餘不變 3 按位異或 x y 對應位相同為0,不同為1 ...