找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5845|回復(fù): 6
收起左側(cè)

關(guān)于<<左移符號(hào),有個(gè)搞不懂的地方,請(qǐng)大家指點(diǎn)一下,謝謝!

[復(fù)制鏈接]
ID:404479 發(fā)表于 2018-10-27 12:31 來(lái)自觸屏版 | 顯示全部樓層 |閱讀模式
void main ()
{
      P2=(0xfe<<1);
}
首先,0xfe化成二進(jìn)制1111 1110,于是左移一位=11111101,那么,就應(yīng)該是P2.1口的發(fā)光二極管亮啊,為什么左移了一位,實(shí)驗(yàn)結(jié)果會(huì)是P2.0口和P2.1口的發(fā)光二極管都同時(shí)點(diǎn)亮,搞不懂請(qǐng)大家指點(diǎn)迷津,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2018-10-28 08:16 | 顯示全部樓層
0xfe化成二進(jìn)制1111 1110,于是左移一位=11111100,最高位溢出,最低位補(bǔ)0。使用循環(huán)左移一位才能把最高位補(bǔ)到最低位。P2=_crol_(P2,1);
回復(fù)

使用道具 舉報(bào)

ID:416564 發(fā)表于 2018-10-28 10:43 | 顯示全部樓層
可能是默認(rèn)用0補(bǔ)上吧
回復(fù)

使用道具 舉報(bào)

ID:395560 發(fā)表于 2018-10-28 10:50 | 顯示全部樓層
0xfe化成二進(jìn)制1111 1110,左移一位=11111100;
回復(fù)

使用道具 舉報(bào)

ID:416611 發(fā)表于 2018-10-28 10:50 | 顯示全部樓層
左移后不應(yīng)該右邊置零嗎
回復(fù)

使用道具 舉報(bào)

ID:415459 發(fā)表于 2018-10-28 16:26 | 顯示全部樓層
移位分為邏輯左移,邏輯右移以及算數(shù)右移。
1、邏輯左移
左移n位,低n位補(bǔ)0,視數(shù)據(jù)類型的長(zhǎng)度截?cái)嘁莆恢蟮臄?shù)據(jù)。如題主所描述的,0xfe為一個(gè)字節(jié),用二進(jìn)制表示為0b1111 1110,也就是8個(gè)比特,左移一位之后,最低位補(bǔ)0,數(shù)據(jù)長(zhǎng)度為9個(gè)比特,用二進(jìn)制表示為0b1 1111 1100,由于一個(gè)字節(jié)只能存儲(chǔ)八個(gè)比特,最高位溢出,最終移位的結(jié)果為0b1111 1100。
不同于右移,左移只有邏輯移位,沒(méi)有算數(shù)移位。
2、邏輯右移
數(shù)據(jù)右移,處于高位的比特會(huì)空出來(lái),為保證數(shù)據(jù)長(zhǎng)度一致,這就涉及到對(duì)空出來(lái)的比特位填充的問(wèn)題。當(dāng)始終填充0時(shí),不考慮原始數(shù)據(jù)的最高位比特,該右移被稱為邏輯右移。
例如,0b1111 1110 ->邏輯右移1位->0b0111 1111
3、算數(shù)右移
和邏輯右移填充0不同,當(dāng)原始數(shù)據(jù)的最高位為1時(shí),填充位為1,當(dāng)原始數(shù)據(jù)的最高位為0時(shí),填充位為0,也就是填充位等于原始數(shù)據(jù)的最高位。
例如,0b1111 1110 ->算數(shù)右移->0b1111 1111

回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2018-10-29 09:18 | 顯示全部樓層
如果你是想只亮P21,那么,就必須是循環(huán)移位。
第一:加上頭文件:intrins.h
第二:使用這個(gè)頭文件中的循環(huán)移位函數(shù):_crol_()向左(高位)移位和_cror_()向右(低位)移位函數(shù)。
這樣,就不會(huì)是<<或>>命令中用零填空了,而是以你已經(jīng)有的數(shù)據(jù)進(jìn)行循環(huán)移位。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表