c語(yǔ)言中的移位運(yùn)算符
移位運(yùn)算符在程序設(shè)計(jì)中,是位操作運(yùn)算符的一種。移位運(yùn)算符可以在二進(jìn)制的基礎(chǔ)上對(duì)數(shù)字進(jìn)行平移。
c語(yǔ)言中提供了兩種移位運(yùn)算符:
左移運(yùn)算符:<<
右移運(yùn)算符:>>
左移運(yùn)算符(<<)
int main(void) { int a = 4; //把a(bǔ)的二進(jìn)制位向左移動(dòng)1位 int b = a << 1; printf("b = %d", b); return 0; }
在32位操作系統(tǒng)中,int類型占4個(gè)字節(jié),1個(gè)字節(jié)有8bit,所以變量a在內(nèi)存中占32個(gè)比特位。
將4賦值給變量a,a中存放的是4的二進(jìn)制形式。
將a向左移動(dòng)一位
最高位的0丟棄,末位補(bǔ)0
可以看到a左移一位后的結(jié)果是1000,轉(zhuǎn)換成10進(jìn)制就是8,所以打印b的結(jié)果就是8。
右移運(yùn)算符(>>)
int main(void) { int a = 10; //把a(bǔ)的二進(jìn)制位向右移動(dòng)1位 int b = a >> 1; printf("b = %d", b); return 0; }
把10賦值給變量a,將10表示成二進(jìn)制形式
將10向右移動(dòng)一位,最低位的0丟棄
最高位補(bǔ)0
最后的結(jié)果轉(zhuǎn)換成10進(jìn)制就是5
我們可以看到最后打印b的結(jié)果確實(shí)是5。
這里需要注意的是,右移分為算數(shù)右移和邏輯右移
算數(shù)右移: 右邊丟棄,左邊補(bǔ)原符號(hào)位
邏輯右移: 右邊丟棄,左邊補(bǔ)0
內(nèi)存中存放二進(jìn)制序列的時(shí)候,最高位是0表示正數(shù),最高位是1表示負(fù)數(shù)。
因?yàn)?0是正數(shù),所以無(wú)論是算數(shù)右移還是邏輯右移,最高位都是補(bǔ)0。那么這里的右移運(yùn)算到底是算數(shù)右移還是邏輯右移呢?
整數(shù)的二進(jìn)制表示形式有三種:原碼、反碼、補(bǔ)碼
原碼:直接根據(jù)數(shù)值寫(xiě)出的二進(jìn)制序列
反碼:原碼的符號(hào)位不變,其他位按位取反
補(bǔ)碼:反碼加1
計(jì)算機(jī)內(nèi)存數(shù)值存儲(chǔ)方式是補(bǔ)碼
int main(void) { int a = -1; //把a(bǔ)的二進(jìn)制位向右移動(dòng)1位 int b = a >> 1; printf("b = %d", b); return 0; }
以-1為例
-1的原碼:
-1的反碼:
-1的補(bǔ)碼:
因?yàn)橛?jì)算機(jī)中存儲(chǔ)的是補(bǔ)碼,將-1右移1位,最低位的1舍棄
先來(lái)看b的打印結(jié)果
b的值為-1,說(shuō)明最高位補(bǔ)的是1,此時(shí)進(jìn)行的是算數(shù)右移。
需要注意的是,雖然a進(jìn)行了右移操作,但是a的值是不發(fā)生改變的,我們可以將a也打印出來(lái)
int main(void) { int a = 10; //把a(bǔ)的二進(jìn)制位向右移動(dòng)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;
和上面的代碼是一樣的,在進(jìn)行移位運(yùn)算的時(shí)候,移位對(duì)象的值并不會(huì)發(fā)生改變
到此這篇關(guān)于c語(yǔ)言中的移位運(yùn)算符的文章就介紹到這了,更多相關(guān)c語(yǔ)言 移位運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)經(jīng)典10大排序算法刨析
這篇文章主要介紹了C語(yǔ)言中常用的10種排序算法及代碼實(shí)現(xiàn),開(kāi)發(fā)中排序的應(yīng)用需要熟練的掌握,因?yàn)槭腔A(chǔ)內(nèi)容,那C語(yǔ)言有哪些排序算法呢?本文小編就來(lái)詳細(xì)說(shuō)說(shuō),需要的朋友可以參考一下2022-02-02OpenCV實(shí)現(xiàn)圖像角點(diǎn)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像角點(diǎn)檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Qt線程QThread開(kāi)啟和安全退出的實(shí)現(xiàn)
本文主要介紹了Qt線程QThread開(kāi)啟和安全退出的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C++ API功能設(shè)計(jì)的實(shí)現(xiàn)
C++ API中看似很小的修改,都可能會(huì)影響到生成的對(duì)象和庫(kù)文件的二進(jìn)制表示,如果客戶想替換共享庫(kù)使之工作,就不能簡(jiǎn)單的替換庫(kù)文件了事,而往往需要重新編譯2022-08-08