请问:单片机c语言中如何实现将变量A中某1位赋值给B中某1位的操作?

请问:单片机c语言中如何实现将变量A中某1位赋值给B中某1位的操作?B中其他位在以后的程序中还有用。
若以上动作要多次使用,有没有高效便捷的方法?

假如将A第三位赋给B第二位

对于C51架构单片机,可使用位寻址:
bdata A, B;
sbit a3 = A^3; //位变量指向A第三位
sbit b2 = B^2;
b2 = a3;

对于其他任何类型单片机,可使用位操作宏(同样适用于C51):
#define get_bit(var, n) (var & (1<<n))
#define set_bit(var, n) (var |= (1<<n))
#define clr_bit(var, n) (var &= ~(1<<n))

使用方法
if(get_bit(A, 3))set_bit(B, 2);
else clr_bit(B, 2);

这是速度最快的方法。移位操作在编译的时候已经被优化了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-08
我这个效率最高,因为我查过汇编。不相信你可以测试看看。
以下0x02 和 0x40 是假设的位置。你可以用任何取代。

if (a & 0x02) b |= 0x40;
else b &= ~0x40;

你用移位 << 或者>> 速度都慢。
第2个回答  2010-05-08
changebit(char i,char j,char A, char B)
{
char m, n = 0x01;
m = (A>>i) & n ;
B = !(0x01<<j)&B | (m << j);

}
第3个回答  2010-05-08
B=((A&0x01)|(B&0xfe))(假定都是最低位,其他位的话改改也ok),没有判断,不用跳转,或许这样效率高一点
第4个回答  2010-05-17
int a;
a=A&0x40;//第六位
B=B&a;
第5个回答  2019-05-30
假如将A第三位赋给B第二位
对于C51架构单片机,可使用位寻址:
bdata
A,
B;
sbit
a3
=
A^3;
//位变量指向A第三位
sbit
b2
=
B^2;
b2
=
a3;
对于其他任何类型单片机,可使用位操作宏(同样适用于C51):
#define
get_bit(var,
n)
(var
&
(1<<n))
#define
set_bit(var,
n)
(var
|=
(1<<n))
#define
clr_bit(var,
n)
(var
&=
~(1<<n))
使用方法
if(get_bit(A,
3))set_bit(B,
2);
else
clr_bit(B,
2);
这是速度最快的方法。移位操作在编译的时候已经被优化了。
相似回答