c語言中的移位運算符
移位運算符在程序設(shè)計中,是位操作運算符的一種。移位運算符可以在二進制的基礎(chǔ)上對數(shù)字進行平移。
c語言中提供了兩種移位運算符:
左移運算符:<<
右移運算符:>>
左移運算符(<<)
int main(void)
{
int a = 4;
//把a的二進制位向左移動1位
int b = a << 1;
printf("b = %d", b);
return 0;
}
在32位操作系統(tǒng)中,int類型占4個字節(jié),1個字節(jié)有8bit,所以變量a在內(nèi)存中占32個比特位。
將4賦值給變量a,a中存放的是4的二進制形式。

將a向左移動一位

最高位的0丟棄,末位補0

可以看到a左移一位后的結(jié)果是1000,轉(zhuǎn)換成10進制就是8,所以打印b的結(jié)果就是8。

右移運算符(>>)
int main(void)
{
int a = 10;
//把a的二進制位向右移動1位
int b = a >> 1;
printf("b = %d", b);
return 0;
}
把10賦值給變量a,將10表示成二進制形式

將10向右移動一位,最低位的0丟棄

最高位補0

最后的結(jié)果轉(zhuǎn)換成10進制就是5

我們可以看到最后打印b的結(jié)果確實是5。
這里需要注意的是,右移分為算數(shù)右移和邏輯右移
算數(shù)右移: 右邊丟棄,左邊補原符號位
邏輯右移: 右邊丟棄,左邊補0
內(nèi)存中存放二進制序列的時候,最高位是0表示正數(shù),最高位是1表示負數(shù)。
因為10是正數(shù),所以無論是算數(shù)右移還是邏輯右移,最高位都是補0。那么這里的右移運算到底是算數(shù)右移還是邏輯右移呢?
整數(shù)的二進制表示形式有三種:原碼、反碼、補碼
原碼:直接根據(jù)數(shù)值寫出的二進制序列
反碼:原碼的符號位不變,其他位按位取反
補碼:反碼加1
計算機內(nèi)存數(shù)值存儲方式是補碼
int main(void)
{
int a = -1;
//把a的二進制位向右移動1位
int b = a >> 1;
printf("b = %d", b);
return 0;
}
以-1為例
-1的原碼:

-1的反碼:

-1的補碼:

因為計算機中存儲的是補碼,將-1右移1位,最低位的1舍棄

先來看b的打印結(jié)果

b的值為-1,說明最高位補的是1,此時進行的是算數(shù)右移。
需要注意的是,雖然a進行了右移操作,但是a的值是不發(fā)生改變的,我們可以將a也打印出來
int main(void)
{
int a = 10;
//把a的二進制位向右移動1位
int b = a >> 1;
printf("a = %d\n", a);
printf("b = %d", b);
return 0;
}

a的結(jié)果仍然是10。
int a = 10; int b = a + 1;
和上面的代碼是一樣的,在進行移位運算的時候,移位對象的值并不會發(fā)生改變
到此這篇關(guān)于c語言中的移位運算符的文章就介紹到這了,更多相關(guān)c語言 移位運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Clion配置opencv開發(fā)環(huán)境的詳細過程
這篇文章主要介紹了Clion配置opencv開發(fā)環(huán)境的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考的下2022-04-04
vscode+qt5+cmake編譯調(diào)試過程解析
這篇文章主要介紹了vscode+qt5+cmake編譯調(diào)試過程解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
Qt串口通信開發(fā)之QSerialPort模塊詳細使用方法與實例
這篇文章主要介紹了Qt串口通信開發(fā)之QSerialPort模塊詳細使用方法與實例,需要的朋友可以參考下2020-03-03

