[c/c++] programming之路(30)、位運算(一)

1、取反  ~

#include<stdio.h>
#include<stdlib.h>

void main(){
    unsigned char ch=15;    //0000 1111     char的單位是字節,1B=8bit,因此是8位
    unsigned char fch=~ch;    //1111 0000     取反      
    unsigned char ffch=~fch;//0000 1111     

    printf("%d,%d,%d\n",ch,fch,ffch);
    system("pause");
}

注意:取反運算符不改變操做數的值,賦值運算符纔會改變。面試

2、與運算  &

#include<stdio.h>
#include<stdlib.h>

//位與    1,1->1    01,10,00->0
//1&0=0 , 0&0=0    ->清零
//1&1=1 ,0&1=0 ->保留某些位不變 

void main0(){
    unsigned char ch1=3;    //0000 0011     
    unsigned char ch2=240;    //1111 0000         
    unsigned char ch3=255;    //1111 1111

    printf("%d\n",ch1&ch2); //0000 0000  0
    printf("%d\n",ch1&ch3); //0000 0011  3
    printf("%d\n",ch2&ch3); //1111 0000  240
    system("pause");
}

//位與實現按位清零
void main1(){
    unsigned char ch1=255;    //1111 1111     
    unsigned char ch2=15;    //0000 1111         
    unsigned char ch3=240;    //1111 0000         
    
    printf("%d\n",ch1&ch2); //清零高四位
    printf("%d\n",ch1&ch3); //清零低四位
    printf("%d\n",ch1&0);    //所有清零
    system("pause");
}

//位與實現取出指定位
void main(){
    unsigned char ch=169;    //1010 1001
    unsigned char ch1=60;    //0011 1100     
                            //0010 1000        40
    
    printf("%d\n",ch&ch1); //取出中間四位
    system("pause");
}

3、或運算  |

#include<stdio.h>
#include<stdlib.h>

//位或運算    1|1=1    1|0=1    0|1=1    0|0=0
void main0(){
    unsigned char ch=169;    //1010 1001
    unsigned char ch1=240;    //1111 0000     
                            //1111 1001        249
    printf("%d\n",ch|ch1); 
    system("pause");
}

//位或運算符能夠讓某些位變成1    1|0 = 1|1 =1
//    0|1=1    0|0=0    與0相或不改變
void main(){
    unsigned char ch=169;    //1010 1001
    unsigned char ch1=15;    //0000 1111
                            //1010 1111        實現低四位所有變1
    printf("%d\n",ch|ch1); 
    system("pause");
}

4、異或運算 ^(相同爲0,相異爲1)

不借助中間變量,實現兩變量交換值spa

#include<stdio.h>
#include<stdlib.h>

//異或    1^1=0    1^0=1    0^1=1    0^0=0
void main0(){
    unsigned char ch1=169;    //1010 1001
    unsigned char ch2=15;    //0000 1111 
                            //1010 0110        166
    printf("%d\n",ch2^ch1); 
    system("pause");
}

//異或能夠實現反轉
void main1(){
    unsigned char ch1=169;    //1010 1001
    unsigned char ch2=255;    //1111 1111        所有反轉
                            //0101 0110        86
    printf("%d\n",ch2^ch1); 
    system("pause");
}
void main2(){
    unsigned char ch1=169;    //1010 1001
    unsigned char ch2=60;    //0011 1100        指定位反轉(中間反轉)
                            //1001 0101        149
    printf("%d\n",ch2^ch1); 
    system("pause");
}

//異或交換兩個變量 //不借助中間變量,實現兩個變量的交換——>面試和嵌入式開發 //x,y交換值 x=x^y;y=x^y;x=x^y /* 等同於加減法實現交換值 x=20,y=10; x=x+y; //x=30,y=10 y=x-y; //x=30,y=20 x=x-y; //x=10,y=20 */ void main(){ unsigned char ch1=20; //0001 0100 unsigned char ch2=10; //0000 1010 printf("%d,%d\n",ch1,ch2); ch1=ch1^ch2; ch2=ch1^ch2; ch1=ch1^ch2; printf("交換以後%d,%d\n",ch1,ch2); system("pause"); }

5、位運算總結

#include<stdio.h>
#include<stdlib.h>

void main(){
    unsigned char ch1=168;                //1010 1000
    unsigned char ch2=133;                //1000 0101    

    printf("&與:%d\n",ch1&ch2);        //1000 0000        128
    printf("|或:%d\n",ch1|ch2);        //1010 1101        173
    printf("^異或:%d\n",ch1^ch2);        //0010 1101        45
    unsigned char ch3=~ch1,ch4=~ch2;
    printf("~反:%d,%d        %d,%d\n",ch3,ch4,~ch1,~ch2);    
    system("pause");
}

相關文章
相關標籤/搜索