文中2'k代表2的k次方
1 除以2的k次冪可以用位運算:
n/2'k == n>>k
2 對2的k次冪取餘數可以用位運算:
n%2'k == n & ((1<
比如 100%32
100的二進位制為 1100100
((1<<5)-1)等於31為 0011111
兩個數相與即得 100,故
100%32 = 4
3 對於整數n,從低位開始,把它的第k位(0<=k<=31)置為1的操作為:
n = n | (1<
4 對於整數n,從低位開始,把它的第k位(0<=k<=31)置為0的操作為:
n = n & ~(1<
5 對於整數n,從低位開始,測試它的第k位(0<=k<=31)是否為1,若為1,返回乙個大於0的數,否則返回0
return n & (1<
6 對於整數n,判斷它是奇數還是偶數
若n & 1大於0,則n是奇數,否則n是偶數
7 對於整數n,若n是奇數,則把n減1變成偶數,若n是偶數,則把n加1變成奇數
n = n ^ 1
8 對於奇數n,有如下性質
(n-1) ^ n ==1
9 最大的int
01 1111111111 1111111111 1111111111
max_int = ~(1<<31)
10 最小的int
10 0000000000 0000000000 0000000000
min_int = (1<<31)
11 把最低位的1變為0
比如: 111000 ---> 110000
n = n - (n&-n)
12 判斷兩個整數數是否同號
#define mask 0x80000000
flag = (x & mask) ^ (y & mask)
如果flag為0,說明不同號,否則同號
13 交換兩個值,不用臨時變數
想將a和b的值互換,可以用以下賦值語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
14 bitset的c語言實現
#include #include #define n 4000000000#define shift 5
#define mask 0x1f
int a[1+n/32];
void set(unsigned int i)
void clr(unsigned int i)
unsigned int test(unsigned int i)
int main()
for (i = 0; i < 10; i++)
} getchar();
return 0;
}
位運算(1) 初識位運算
前段時間數電課學了些進製轉換,還有與或非等邏輯運算,如今再來看看位運算,倒輕鬆了不少。很早就想寫些非總結性部落格了,奈何還是太懶。也也不知怎的突然又來了興致,趕忙寫下這篇部落格。廢話不多說,今天準備總結總結關於位運算的知識。程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的,即0 1兩種狀態,...
位運算子和位運算
一 按位與 運算子 1 運算規則 參加運算的兩個 資料,按二進位進行 與 運算,如果兩個相應的二進位都為1,則該位的結果值為1,否則為0,即 0 0 0,0 1 0,1 0 0,1 1 1.2 用途 1 清零 運算物件 原來的數中為1的位,新數中相應位為0。2 取乙個數中某些指定位。如想要取乙個整數...
位運算子與位運算
位運算是對二進位制位的操作,它應用於整形資料,把整形資料看成固定的二進位制序列,然後對二進位制序列進行位運算 按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例c a b a 1010...