访问变量的各个位

时间:2019-05-07 17:56:34

标签: gcc bit-manipulation avr

在我的应用程序中,我有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;

,然后对“结构”中的其余位重复该操作。

任何人都欢迎。

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)
  }
}