第16課 位運算符分析

位運算符分析
·C語言中的位運算符
image.png
·左移和右移注意點
-左操做數必須爲整數類型
·char和short被隱藏式轉換爲int後進行移位操做
-右操做數的範圍必須爲:[0-31]
-左移運算符<<將運算符的二進制位左移
·規則:高位丟棄,低位補0
-右移運算符>>把運算數的二進制位右移
·規則:高位補符號位,低位丟棄(正數補0,負數補1)
image.png
例子16-1:算法

include"stdio.h"

int main()
{spa

printf("%d\n",3 << 2);    //3 = 二進制11
printf("%d\n",3 >> 1);
printf("%d\n",-1 >> 1);
printf("%d\n",0x01 << 2 + 3); //加法的優先級高於左移運算符
printf("%d\n",3 << -1);   //error超出左移右移的範圍

}
輸出結果:
12
1
-1
32
0
image.png
例子16-2:交換a,b的值三種算法code

include "stdio.h"

define SWAP1(a , b) {int t = a; a = b; b = t;}

define SWAP2(a , b) {a = a + b;b = a - b;a = a - b; }

define SWAP3(a , b) {a = a ^ b;b = a ^ b;a = a ^ b; } //a^b的值相同時,爲0;不一樣時爲1;(a ^ b)^b

int main()
{blog

int a = 1;
int b = 2;
printf("a = %d\n",a);
printf("b = %d\n",b);
SWAP3(a , b);
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0;

}
輸出結果:
a = 1
b = 2
a = 2
b = 1
image.png
例子16-3-1:it

include "stdio.h"

int main()
{io

int i = 0;
int j = 0;
int k = 0;
if(++i | ++j & ++k)
{
    printf("Run here ..\n");
}
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("k = %d\n",k);
return 0;

}
輸出結果:
Run here ..
i = 1
j = 1
k = 1
例子16-3-2:class

include "stdio.h"

int main()
{效率

int i = 0;
int j = 0;
int k = 0;
if(++i || ++j && ++k)
{
    printf("Run here ..\n");
}
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("k = %d\n",k);
return 0;

}
輸出結果:
Run here ..
i = 1
j = 0
k = 0
小結:
·位運算符只能用於整數類型
·左移與右移運算符的右操做數範圍必須爲[0,31];
·位運算符沒有短路規則,全部的操做數均會求值
·位運算的效率高於四則預算和邏輯運算
·運算優先級:四則運算>位運算>邏輯運算二進制

相關文章
相關標籤/搜索