文章目錄
- 算術運算子
- 移位運算子
- 1.左移運算子
- 2.右移運算子
- 位運算子
- 1.按位與
- 2.按位或
- 3.按位異或
- 4.按位與和按位異或的應用
- 1.按位異或的應用
- 2.按位與的應用
- 賦值運算子
- 復合運算子
算術運算子
+ - * / %
1.除了 % 運算子,其他運算子都可以作用于整數和浮點數.
2.對于 / 運算子,如果兩端都為整數,執行整數除法,只要有一端為浮點數就為小數除法
3.%運算子兩端必須都為整數,回傳的是整除之后的余數
移位運算子
1.左移運算子
左移運算子移動規則: 左邊拋棄,右邊補0
左移其實移動的是存盤在記憶體中的二進制的補碼,
先看一下正數的情況
#include<stdio.h>
int main()
{
int a = 5;
int b = a<<1;
printf("%d",b);
}
// 輸出結果為 10

再看一下負數的情況
#include<stdio.h>
int main()
{
int a = -1;
int b = a<<1;
printf("%d",b);
}
// 輸出結果為 -2

2.右移運算子
右移運算子分為兩類:
1.算數右移:
右邊丟棄,左邊補符號位
2.邏輯右移
右邊丟棄,左邊補0
具體采用哪種方式,取決于編譯器,
#include<stdio.h>
int main()
{
int a = -1;
int b = a >> 1;
printf("%d",b);
}
// 輸出結果為-1

警告: 對于移位運算子,不要移動負數位,這個是標準未定義的,
#include<stdio.h>
int main()
{
int num = 10;
num>> -1;// error
}
位運算子
1.按位與
& : 按二進制(補碼)位與 , 都為1才是1,否則為0
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("%d\n",c);
}
// 輸出結果為1

2.按位或
| : 按二進制(補碼)位或 , 有一位是1就是1 , 全為0才為0 .
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("%d\n",c);
}
// 輸出結果為7

3.按位異或
^ : 按二進制(補碼)位異或 , 相同的為0 , 不相同的為1 .
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a ^ b;
printf("%d\n",c);
}
// 輸出結果為6

警告 : & | ^ 只能作用于整形
4.按位與和按位異或的應用
1.按位異或的應用
大家一定都做過交換兩個數的值 , 用的最多的方法應該是創建一個臨時變數的方
法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int tmp = a;
a = b;
b = tmp;
printf("a = %d,b = %d", a, b);
}
// 輸出結果 a = 5, b = 3
現在要求不創建臨時變數,交換兩個整數的值,可能有人會想到下面這種做法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a = %d,b = %d", a, b);
}
// 輸出結果 a = 5, b = 3
但這種做法有缺陷 ,如果我們的a , b比較大,但還沒有超出整形的范圍,但a + b就會發
生溢位,導致結果錯誤,
現給出按位異或的做法
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d,b = %d", a, b);
}
// 輸出結果 a = 5, b = 3
2.按位與的應用
求一個整數存盤在記憶體中二進制1的個數
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//計數
while(num)
{
count++;
num = num&(num-1);
}
printf("二進制中1的個數 = %d\n",count);
return 0;
}
賦值運算子
賦值運算子是一個很棒的運算子,他可以讓你得到一個你之前不滿意的值,也就是你可以
給自己重新賦值,
#include<stdio.h>
int main()
{
int weight = 120;
weight = 89;
double salary = 10000.0;
salary = 20000.0;
// 賦值運算子可以連續使用
int a = 10;
int x = 0;
int y = 20;
a = x = y + 1; // 連續賦值
// 相當于以下代碼
x = y + 1;
a = x;
}
復合運算子
+=
-=
*=
/=
%=
》=
《=
&=
|=
^=
int x = 10;
x = x + 10;
x += 10;//復合賦值
//其他運算子一樣的道理,這樣寫更加簡潔
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253149.html
標籤:其他
