在我的应用程序中,我有2个变量(shift_counter和shift_counter_copy)。我需要做的是获取Shift_counter的低字节并操作这些位。我首先将变量shift_counter_copy中的值复制到shift_counter中。接下来,我将查询shift_counter低字节中的各个位,并基于结果集,或将shift_counter_copy变量的低位特定位清除。我写了以下代码;
`void reverse_byte ()
{
uint8_t n ;
For (n=0; n<7; n++)
{
If (shift_counter(n) == 1 )
{
shift_counter_copy(7-n) = 1;
}
else
{
shift_counter_copy(7-n) = 0;
}
}
shift_counter &= 0xFF00 ;
shift_counter | shift_counter_copy ;
};
但是我不确定编译器是否接受所示的寻址单个位的方法。我以为我可以创建一个“结构”;
stuct shift_counter
(
shift_counter_0 [1];
shift_counter_1 [1];
shift_counter_2 [1];
shift_counter_3 [1];
shift_counter_4 [1];
shift_counter_5 [1];
shift_counter_6 [1];
shift_counter_7 [1];
shift_counter_8 [1];
shift_counter_9 [1];
shift_counter_10 [1];
shift_counter_11 [1];
shift_counter_12 [1];
shift_counter_13 [1];
shift_counter_14 [1];
shift_counter_15 [1];
);
但是考虑了一下之后,我认为它不适用于我的“ for”循环,因为编译器会寻找每个位的全名。 C语言中是否有任何方法可以允许访问变量的每一位,以便一个人可以执行如上所述的FOR循环?还是,用户会因为使用掩码来获取每个位的值而陷入困境?或者,是否可以创建类似的定义;
定义shift_counter(1)= shift_counter_1;
,然后对“结构”中的其余位重复该操作。
任何人都欢迎。
答案 0 :(得分:1)
可以使用##
#define shift_counter(n) shift_counter_ ## n
因此,shift_counter(1)
将在编译之前由shift_counter_1
替换。但是它仅在编译时对源代码有效。即shift_counter(7-n)
将替换为shift_counter_7-n
,您将无法在运行时使用它。
但是我不明白为什么您需要使用一种如此复杂的方法来操作位?只需使用以下模式(假设您有一个整数变量a
)
a |= (1 << n); // set n'th bit
a &= ~(1 << n); // clear n'th bit
a ^= (1 << n); // invert n'th bit
if ((a & (1 << n)) != 0) ... // check if n'th bit is set
例如:
uint16_t shift_counter_copy = 0;
for (int i = 0 ; i < 8; i++) {
if ((shift_counter & (1 << i)) != 0) { // if i'th bit in shift_counter is set
shift_counter_copy |= (1 << (7 - i)) // set (7-i)'th bit in shift_counter_copy
} else {
shift_counter_copy &= ~(1 << (7 - i)) // else clear (actually not needed, since shift_counter_copy initialized to zero)
}
}