KeilC51下的帶進位循環(huán)右移指令是什么
比如將a=0x45循環(huán)左移二位。a循環(huán)左移n位,即將原來右面(8-n)位左移n位,而將原來左端的n位移到最右面n位。
本文引用地址:http://m.butianyuan.cn/article/201611/315471.htm實現步驟:
1、將a的左端n位先放到b中的高n位中
b=>>(8-n);
2、將a左移n位,其右面高n位被補0
c=<
a=c|b;
程序如下:
main()
{
unsigned char a=0x45,b,c;
unsigned int n=2;
b=a>>8-n)
c=a<
}
二:Keil C言實現循環(huán)移位
在KeilC51中有這樣一個庫,其頭文件為
unsigned char _chkfloat_(float val) 檢查浮點數狀態(tài)
返回值:0: standard floating-point numbers
1: Floating-point value 0
2:+INF (positive overflow)
3:-INF (Not a number) error status
unsigned char _crol_( //字節(jié)的多次循環(huán)左移
unsigned char c, //C左移的字符
unsigned char b);//b左移的位數
unsigned char _cror_( //字節(jié)的多次循環(huán)右移
unsigned char c, //C右移的字符
unsigned char b);//b右左移的位數
unsigned int _irol_ ( //字的循環(huán)左移
unsigned int c, //c左移的字
unsigned char b);//b左移的次數
unsigned int _iror_ ( //字的循環(huán)右移
unsigned int c, //c右移的字
unsigned char b);//b右移的次數
unsigned long _lrol_ ( //4字節(jié)(雙字)的循環(huán)左移
unsigned long c,//c左移的雙字
unsigned char b);//b左移的次數
unsigned long _lror_ ( //4字節(jié)(雙字)的循環(huán)右移
unsigned long c,//c右移的雙字
unsigned char b);//b右移的次數
void _nop_ (void); //NOP 8051中的空操作
bit _testbit_ (bit b);//8051中的JBC指令,測試b,然后清0,返回b的值。
下面是我自己以前寫的東西
匯編的移位操作很容易 RR RRC RL RLC
C51中,移出很容易,<< >> ;移入操作中的左移入也容易,困難在右移入
一:IC讀寫應用
1:送數
送兩個單獨字節(jié)的數據的程序,左送 &0x80 右送 &0x01
bit out;
out = low & 0x01;
low >>= 1;
low |= (high & 0x01)<<7;
high >>= 1;
2:取數(不管怎么移入,第一次操作之后獲取的那一位數據必須在接受數據的最高位或者最低位上,從而選擇是先取數還是先移位) a:如果是先接受高位后接受低位 則先左移一位后接受一位數據(i2c總線)
uchar i;
uchar temp = 0;
uchar date = 0x82;
for (i = 0; i < 8; i++)
{
temp <<= 1; //左移
temp |= (bit)(date & 0x80);
date <<= 1;
}
b:如果是先接受低位,后接受高位 則先接受一位數據后循環(huán)右移一位
uchar i;
uchar temp = 0;
uchar date = 0x82;
for (i = 0; i < 8; i ++)
{
temp |= (bit)(date & 0x01);
date >>= 1;
temp = _cror_(temp,1);
//循環(huán)右移,應用_cror_()需要包含頭文件
}
如果不用函數
則for循環(huán)應該這樣寫
for (i = 0; i < 8; i ++)
{
temp >>= 1;
temp |= (date & 0x01) << 7;
date >>= 1;
}
三:任意一位的置位或者取反運算
置位運算
low |= 0x01; (置最低位為1)
取反運算
low |= ~low & 0x01;
四:合并和拆分數據
1:合并兩個單字節(jié)數據為一個雙字節(jié)數據
int len;
uchar low;
uchar high;
Len |= high;
Len <<= 8;
Len |= low;
2: 拆分一個雙字節(jié)數據為兩個單字節(jié)數據
int len;
uchar low;
uchar high;
low |= len;
high |= len >> 8;
評論