您的位置:首页 > 其它

寄存器的一些操作

2017-09-05 20:02 736 查看

目录

目录
将寄存器中的某一位置1或则清0
其它位重置

其它位不变

判断寄存器某一位为0还是1

将寄存器的某一位取反1-0 0-1

寄存器合并
方法一 有效位之外其他位均为0可以将其先适当移位操作然后在运算

方法二 如果这2个数除了有效位之外其他位需要保留为1方法是先与适当的数之后2个数

寄存器拆分

逻辑移位

将寄存器中的某一位置1或则清0

其它位重置

int l_data;
void SetBit(int pos)//将某一位置位的操作
{
if((pos >= 0) && (pos <= 31))
{
l_data |= BIT_MASK(pos);//BIT_MASK是 掩码。就是除了这一位其余位均为0
}
}
void ClrBit(int pos)//将某一位清0的操作
{
if((pos >= 0) && (pos <= 31))
{
l_data &= ~BIT_MASK(pos);
}
}


其它位不变

WTCON |=  (1 << 5) //WTCON的第五位清1
WTCON &= ~(1 << 5) //WTCON的第五位清0


注意:这两种方法经常用于定义宏,很方便。#define INT_I2_MASK 0x0040

判断寄存器某一位为0还是1

bool is1(int pos)//判断某一位是否为1
{
if((pos >= 0) && (pos <= 31))
{
if(l_data & (BIT_MASK(pos)) == 0x1) //BIT_MASK是掩码。就是除了这一位其余位均为0
{
return true;
}
else
{
return false;
}
}
}


将寄存器的某一位取反(1->0 ; 0->1)

void ReverseBit(int pos)//将某一位取反
{
if((pos >= 0) && (pos <= 31))
{
l_data ^= BIT_MASK(pos);
}
}


寄存器合并

保留2个数的不同部分,将它们合并为1个数

方法一: 有效位之外,其他位均为0,可以将其先适当移位操作,然后在”|”运算。

例:将temp中的低8位和t中的高4位组合成一个12位数

unsigned short temp = 0x00AB;
unsigned char t = 0xC0;
temp = temp<<4;
temp |= (t>>4);


例二:保留channel的底4位,将其作为result的高4位,result的低4位设置为0xC;

channel = (channel<<4) | 0x0C;


方法二: 如果这2个数除了有效位之外,其他位需要保留为1,方法是先与适当的数”|”,之后2个数”&”

例一:保留temp的高4位和line的底4位,并将其组合成result。由于line的其他位全位1,所以必须先将temp的其他位全部设置为1,之后2个数”&”即可。

unsigned char result;
unsigned char temp = 0xAB;
unsigned char line = 0xFE;
temp |= 0x0F;
result = temp&line;


寄存器拆分

将一个16位数的高低8位分别拆成2个8位数,方法是通过多字节数赋给少字节数,多字节数高位字节部分将被自动截取的原理。

unsigned short temp = 0xCDAB;
unsigned char fir;
unsigned char sec;
fir = temp>>8;
sec = temp;


逻辑移位

CPU没有来算数移位操作,如何用逻辑移位操作实现

例如:line = 0xFE,如何实现其的左移操作后,右边补入的是1而不是默认的0。

line = (line<<1)|0x01;


复习一下。原址:http://blog.csdn.net/tkp2014/article/details/49495641
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  寄存器