位運算:
&與|或~非^異或
<< 左移,相當與*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 ...