
提示:以下是本篇文章正文內(nèi)容文中第四部分代碼例子來(lái)自于此篇博客,衷心感謝此博主的分享《https://blog.csdn.net/weixin_42167759/article/details/85624722》
自己加了不少內(nèi)容上去,更好去理解。
Windows下進(jìn)行socket網(wǎng)絡(luò)編程,編寫校驗(yàn)和時(shí)遇到的問(wèn)題,記錄如下。
位移位運(yùn)算符是將數(shù)據(jù)看成二進(jìn)制數(shù),對(duì)其進(jìn)行向左或向右移動(dòng)若干位的運(yùn)算。
位移位運(yùn)算符分為左移和右移兩種,均為雙目運(yùn)算符。
例如: 8>>3 (意思是8向右移動(dòng)3位)第一運(yùn)算對(duì)象是移位對(duì)象,第二個(gè)運(yùn)算對(duì)象是所移的二進(jìn)制位數(shù)。邏輯移位
簡(jiǎn)單理解就是物理上按位進(jìn)行的左右移動(dòng),兩頭用0進(jìn)行補(bǔ)充,不關(guān)心數(shù)值的符號(hào)問(wèn)題。
邏輯左移/右移指令只有它們的移位方向不同,移位后空出的位都補(bǔ)0。算術(shù)移位
同樣也是物理上按位進(jìn)行的左右移動(dòng),兩頭用0或1進(jìn)行補(bǔ)充,但必須確保符號(hào)位不改變。
算術(shù)左移SAL把目的操作數(shù)的低位向高位移,空出的低位補(bǔ)0;
算術(shù)右移SAR把目的操作數(shù)的高位向低位移,空出的高位用最高位(符號(hào)位,0或1)填補(bǔ) 。但我們好奇的是“i<<3”和“i>>3”到底采用的是算術(shù)還是邏輯移位呢?
當(dāng)向左邊移動(dòng)3位,采用的什么方式的移動(dòng)???
#includeint main()
{unsigned int ui = 8;
ui = ui<< 3;
printf("ui = %d 無(wú)符號(hào)類型左移(正數(shù))\n", ui);
int i = 8;
i = i<< 3;
printf("i = %d 有符號(hào)類型左移(正數(shù))\n", i);
int fi = -8;
fi = fi<< 3;
printf("fi = %d 有符號(hào)類型左移(負(fù)數(shù))\n", fi);
return 0;
} 結(jié)果顯示:
ui = 64 無(wú)符號(hào)類型左移(正數(shù))
i = 64 有符號(hào)類型左移(正數(shù))
fi = -64 有符號(hào)類型左移(負(fù)數(shù))
分析:
注意數(shù)在計(jì)算機(jī)里的存儲(chǔ)和表示都是補(bǔ)碼!!!
無(wú)符號(hào)
8 00000000 00000000 00000000 00001000
<----- 左移3位,低位補(bǔ)0
64 00000000 00000000 00000000 01000000
有符號(hào)(即最高位為符號(hào)位)
8 00000000 00000000 00000000 00001000
<----- 左移3位,低位補(bǔ)0
64 00000000 00000000 00000000 01000000
有符號(hào)(即最高位為符號(hào)位)
-8 11111111 11111111 11111111 11111000
<----- 左移3位,低位補(bǔ)0
-64 11111111 11111111 11111111 11000000結(jié)論:左移時(shí)總是移位和補(bǔ)零,無(wú)論是有符號(hào)還是無(wú)符號(hào)都可看作進(jìn)行了邏輯左移。
當(dāng)向右邊移動(dòng)3位,采用的什么方式的移動(dòng)???
#includeint main()
{unsigned int ui = 8;
ui = ui >>3;
printf("ui = %d 無(wú)符號(hào)類型右移(正數(shù))\n", ui);
int i = 8;
i = i >>3;
printf("i = %d 有符號(hào)類型右移(正數(shù))\n", i);
int fi = -8;
fi = fi >>3;
printf("fi = %d 有符號(hào)類型右移(負(fù)數(shù))\n", fi);
return 0;
} 結(jié)果顯示:
ui = 1 無(wú)符號(hào)類型左移(正數(shù))
i = 1 有符號(hào)類型左移(正數(shù))
fi = -1 有符號(hào)類型左移(負(fù)數(shù))
分析:
注意數(shù)在計(jì)算機(jī)里的存儲(chǔ)和表示都是補(bǔ)碼!!!
無(wú)符號(hào)
8 00000000 00000000 00000000 00001000
----->右移3位,高位補(bǔ)0
1 00000000 00000000 00000000 00000001
有符號(hào)(即最高位為符號(hào)位)
8 00000000 00000000 00000000 00001000
----->右移3位,高位補(bǔ)符號(hào)位,即0
1 00000000 00000000 00000000 00000001
有符號(hào)(即最高位為符號(hào)位)
-8 11111111 11111111 11111111 11111000
----->右移3位,高位補(bǔ)符號(hào)位,即1
-1 11111111 11111111 11111111 11111111結(jié)論:
右移時(shí)無(wú)符號(hào)數(shù)是移位和補(bǔ)零,此時(shí)稱為邏輯右移;
右移時(shí)而有符號(hào)數(shù)大多數(shù)情況下是移位和補(bǔ)最左邊的位(也就是補(bǔ)最高有效位),移幾位就補(bǔ)幾位,此時(shí)稱為算術(shù)右移。
其實(shí)可以理解為左移擴(kuò)大,右移縮小。
例如如下c代碼:
int a = 8;
int b1 = a * 4
int b2 = a<< 2 //左移2位相當(dāng)于擴(kuò)大4倍
int b3 = a / 4
int b4 = a >>2 //右移2位相當(dāng)于縮小4倍結(jié)果
b1 = b2 = 4
b3 = b4=1
但是有時(shí)候想把兩個(gè)8位二進(jìn)制數(shù)拼成一個(gè)16位二進(jìn)制,“左移<<” 與 "右移>>"就很重要。例如 00001000 與 00000011 拼接成00001000 00000011:
分析:
二進(jìn)制
a 00001000 <--左移8位,低位補(bǔ)0
a 00001000 00000000
+
b 00000011
——————————————————————————
得到目標(biāo)結(jié)果 00001000 00000011在scoket網(wǎng)絡(luò)編程,例如計(jì)算校驗(yàn)和時(shí),都知道是以16位二進(jìn)制進(jìn)行相加,那么計(jì)算機(jī)是以8位二進(jìn)制讀取,如何將兩個(gè)8位數(shù)字拼成一個(gè)16位數(shù)字,就是利用上方原理講解。
具體可見之前寫的筆記 《校驗(yàn)和之概念、計(jì)算原理、檢驗(yàn)原理、實(shí)例計(jì)算、代碼編程,力薦力薦力薦》
6、總結(jié)左移時(shí)總是移位和補(bǔ)零,無(wú)論是有符號(hào)還是無(wú)符號(hào)都可看作進(jìn)行了邏輯左移。
右移時(shí)無(wú)符號(hào)數(shù)是移位和補(bǔ)零,此時(shí)稱為邏輯右移;
右移時(shí)而有符號(hào)數(shù)大多數(shù)情況下是移位和補(bǔ)最左邊的位(也就是補(bǔ)最高有效位),移幾位就補(bǔ)幾位,此時(shí)稱為算術(shù)右移。
碼字不易,謝謝點(diǎn)贊!!!
碼字不易,謝謝點(diǎn)贊!!!
碼字不易,謝謝點(diǎn)贊!!!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文標(biāo)題:從代碼角度理解:C語(yǔ)言中的“左移<<“與“右移>>“,且結(jié)合應(yīng)用場(chǎng)景-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article22/dodjjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、建站公司、網(wǎng)站改版、網(wǎng)站導(dǎo)航、面包屑導(dǎo)航、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容