一.邏輯運算符 算法
1.& 位與運算 spa
1) 運算規則 開發
位與運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯與運算。例如:int型常量4和7進行位與運算的運算過程以下:get
4=0000 0000 0000 0100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100it
對於負數,按其補碼進行運算。例如:例如:int型常量-4和7進行位與運算的運算過程以下:-4=1111 1111 1111 1100 &7 =0000 0000 0000 0111= 0000 0000 0000 0100io
2) 典型應用 table
(1) 清零 效率
清零:快速對某一段數據單元的數據清零,即將其所有的二進制位爲0。例如整型數a=321對其所有數據清零的操做爲a=a&0x0。 321=0000 0001 0100 0001 &0=0000 0000 0000 0000變量
= 0000 0000 0000 0000循環
(2) 獲取一個數據的指定位
獲取一個數據的指定位。例如得到整型數a=的低八位數據的操做爲a=a&0xFF。321=
0000 0001 0100 0001 & 0xFF =0000 0000 1111 11111
= 0000 0000 0100 0001
得到整型數a=的高八位數據的操做爲a=a&0xFF00。==a&0XFF00==
321=0000 0001 0100 0001 & 0XFF00=1111 1111 0000 0000
= 0000 0001 0000 0000
(3)保留數據區的特定位
保留數據區的特定位。例如得到整型數a=的第7-8位(從0開始)位的數據操做爲: 110000000
321=0000 0001 0100 0001 & 384=0000 0001 1000 0000
=0000 0001 0000 0000
2. | 位或運算
1) 運算規則
位或運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯或運算。例如:int型常量5和7進行位或運算的表達式爲5|7,結果以下:5= 0000 0000 0000 0101
| 7= 0000 0000 0000 0111=0000 0000 0000 0111
2) 主要用途
(1) 設定一個數據的指定位。例如整型數a=321,將其低八位數據置爲1的操做爲a=a|0XFF。321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111
邏輯運算符||與位或運算符|的區別
條件「或」運算符 (||) 執行 bool 操做數的邏輯「或」運算,但僅在必要時才計算第二個操做數。 x || y , x | y 不一樣的是,若是 x 爲 true,則不計算 y(由於不論 y 爲什麼值,「或」操做的結果都爲 true)。這被稱做爲「短路」計算。
3. ^ 位異或
1) 運算規則
位異或運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯異或運算。只有當對應位的二進制數互斥的時候,對應位的結果才爲真。例如:int型常量5和7進行位異或運算的表達式爲5^7,結果以下:5=0000 0000 0000 0101^7=0000 0000 0000 0111
= 0000 0000 0000 0010
2) 典型應用
(1)定位翻轉
定位翻轉:設定一個數據的指定位,將1換爲0,0換爲1。例如整型數a=321,,將其低八位數據進行翻位的操做爲a=a^0XFF;
(2)數值交換
數值交換。例如a=3,b=4。在例11-1中,無須引入第三個變量,利用位運算便可實現數據交換。如下的操做能夠實現a,b兩個數據的交換:
a=a^b;
b=b^a;
a=a^b;
4.~ 位非
位非運算的實質是將參與運算的兩個數據,按對應的二進制數逐位進行邏輯非運算。
二.位移運算符
|
(16) x 的 相反數 表示爲 (~x+1)
#include <stdio.h>//設置x的第y位爲1 #define setbit(x,y) (x)|=(1<<(y-1))//獲得x的第y位的值 #define BitGet(Number,pos) ((Number)>>(pos-1)&1)//打印x的值 #define print(x) printf("%d\n",x)//將整數(4個字節)循環右移動k位 #define Rot(a,k) ((a)<<(k)|(a)>>(32-k))//判斷a是否爲2的冪次數 #define POW2(a) ((((a)&(a-1))==0)&&(a!=0)) #define OPPX(x) (~(x)+1)//返回X,Y 的平均值int average(int x, int y) { return (x&y)+((x^y)>>1); }//判斷a是否爲2的冪次數bool power2(int x) { return ((x&(x-1))==0)&&(x!=0); }//x與y互換void swap(int& x , int& y) { x ^= y; y ^= x; x ^= y; }int main() {int a=0x000D; print(a);int b=BitGet(a,2); print(b); setbit(a,2); print(a); print(BitGet(a,2));int c=Rot(a,33); print(c); print(BitGet(c,5)); printf("8+5=%d\n",average(8,692));int i;for (i=0;i<1000;i++) { if (POW2(i))//調用power2(i) { printf("%-5d",i); } } printf("\n");int x=10,y=90; swap(x,y); print(x); print(y); print(OPPX(-705));return 0; }