循環(huán)移位就是把數(shù)值變成二進(jìn)制,然后循環(huán)移動的過程。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了建德免費(fèi)建站歡迎大家使用!
換句話說,循環(huán)移位就是將移出的低位放到該數(shù)的高位(循環(huán)右移)或把移出的高位放到該數(shù)的低位(循環(huán)左移),左移,和右移動都是對整數(shù)進(jìn)行的操作,在Win32控制臺應(yīng)用程序中,整形占4Byte節(jié)32bit。
循環(huán)左移的過程可以分為3步:
1、將x左端的n位先移動到y(tǒng)的低n位中,x(32-n);
2、將x左移n位,其右面低位補(bǔ)0,xn;
3、進(jìn)行按位或運(yùn)算(x (32 - n) | (x n));
循環(huán)右移的過程可以分為3步:?
1、將x的左端的低n位先移動到y(tǒng)的高n位中x(32-n)
2、將x右移n位,其左面高n位補(bǔ)0xn;
3、進(jìn)行按位或操作(x (32 - n) | (x n));
擴(kuò)展資料
C語言實(shí)現(xiàn)循環(huán)移位:循環(huán)移位是對二進(jìn)制序列進(jìn)行操作,所以實(shí)現(xiàn)循環(huán)移位先需要將需要移位的數(shù)轉(zhuǎn)換為二進(jìn)制序列,然后按照上面描述的步驟進(jìn)行移位,最后將移位后的二進(jìn)制序列打印出來。
所謂循環(huán)移位是指在移位時不丟失移位前原范圍的位,而是將它們作為另一端的補(bǔ)入位。例如循環(huán)右移n位,指各位右移n位,原來的低n位變成高n位,指各位右移n位,原來的低n位變成高n位。
用到循環(huán)移位的操作時,在匯編里面是比較容易實(shí)現(xiàn)的,ror,rol指令就行了。利用位運(yùn)算進(jìn)行循環(huán)移位操作比較容易理解。如果不是循環(huán)移位,使用xn(左移n位),xn右移n位。
參考資料來源:百度百科—循環(huán)移位運(yùn)算
循環(huán)左移時,用從左邊移出的位填充字的右端,而循環(huán)右移時,用從右邊移出的位填充字的左側(cè)。這種情況在系統(tǒng)程序中時有使用,在一些控制程序中用得也不少。設(shè)有數(shù)據(jù)說明:
a=01111011,循環(huán)左移2位 正確結(jié)果: 11101101
過程:
b=a(8-2) 用來得到正常左移丟失的位和循環(huán)移位后其正確位置 b=00000001;
a=a2;左移 a=11101100
a=a|b; a=11101101
如果不是用中間變量 a=(a(8-2))|(a2)
總長度N(8 16 32)
循環(huán)左移n: (a(N-n))|(an)
循環(huán)右移n: (a(N-n))|(an)
C語言的位運(yùn)算功能是其區(qū)別于其他大多數(shù)高級程序設(shè)計(jì)語言的特色之一,用它可以方便實(shí)現(xiàn)一些特殊功能,靈活掌握是用C程序編寫系統(tǒng)程序的基礎(chǔ)。
擴(kuò)展資料:
C語言高效編程技巧:
一:以空間換時間
計(jì)算機(jī)程序中最大的矛盾是空間和時間的矛盾,那么,從這個角度出發(fā)逆向思維來考慮程序的效率問題
二:數(shù)學(xué)方法解決問題
數(shù)學(xué)是計(jì)算機(jī)之母,沒有數(shù)學(xué)的依據(jù)和基礎(chǔ),就沒有計(jì)算機(jī)發(fā)展,所以在編寫程序的時候,采用一些數(shù)學(xué)方法會對程序的執(zhí)行效率有數(shù)量級的提高。
三:使用位操作
實(shí)現(xiàn)高效的C語言編寫的第三招----使用位操作,減少除法和取模的運(yùn)算。
在計(jì)算機(jī)程序中,數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運(yùn)算”來完成所有的運(yùn)算和操作。一般的位操作是用來控制硬件的,或者做數(shù)據(jù)變換使用,但是,靈活的位操作可以有效提高程序運(yùn)行的效率。
參考資料來源:百度百科-c語言程序設(shè)計(jì)
#include?stdio.h
#include?math.h
unsigned?fun(unsigned?num,?int?n)
{
if(n??0)
{
//sizeof(unsigned)*8計(jì)算變量所占位數(shù),如int型占32位
return?(num??(sizeof(unsigned)*8?-?n))?|?(num??n);?//先高位移動,再低位移動后,兩者按位或,相當(dāng)把低位溢出的又添加到了高位,實(shí)現(xiàn)了循環(huán)的效果?
}?
else?
{
return?(num??(sizeof(unsigned)*8?-?abs(n)))?|?(num??abs(n));
}
}
void?main(void)?
{
printf("%u\n",?fun(2,?-34));
}
首先對比一下 左邊與右邊 那里有不同 同時 程序不同對應(yīng)的輸出結(jié)構(gòu)有哪些不同。。
P2口 連接8個LED 低電平驅(qū)動使其發(fā)光。
P2=0xfe //上電 P2.0連接的 LED發(fā)光。 其余的熄滅。
對比一下程序
void main() //主函數(shù)
{
P2=0xfe; //P2初始化
while(1) //死循環(huán)
{
num=P2; //這里 與左邊不同 把P2的狀態(tài)給 NUM 也就是0XFE num=0xfe
P2=_crol_(num,1); //P2等于num 循環(huán)左移 P2=0xef 這時應(yīng)該是連接的P2.7的LED發(fā)光
delay(0);//延遲
}
}
左邊 代碼 NUM 每次大循環(huán) 都賦值 num=0xfe 是固定的 所以不管你以后怎么移動 P2口的輸出都是不變得 只移動了一次。。
#include stdio.h
void fun(int value,int n,int dire)
{
if(dire==0) return;
int x=1(sizeof(int)*8-1);
int temp;
int i;
if(dire0)
{
for(i=0;in;i++)
{
temp=value1;
value=1;
if(temp) value|=x;
}
}
else
{
for(i=0;in;i++)
{
temp=value x;
value=1;
if(temp) value|=1;
}
}
}
void main()
{
int x=0x55555555;
fun(x,1,1);
printf("%x",x);
}
網(wǎng)站名稱:c語言循環(huán)左移右移函數(shù) c語言實(shí)現(xiàn)循環(huán)右移
文章來源:http://chinadenli.net/article46/hgsseg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、App設(shè)計(jì)、網(wǎng)站改版、網(wǎng)站收錄、定制網(wǎng)站、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)