首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的布尔数组和逐位运算

C语言中的布尔数组和逐位运算
EN

Stack Overflow用户
提问于 2019-04-09 18:35:45
回答 5查看 1.1K关注 0票数 2

我必须实现一组串行移位寄存器,每个寄存器有8个输出。输出连接到开关,所以我目前在C中使用布尔数组来打开开关(true)或关闭开关(False)。

因此,每个移位寄存器都有一个包含8个布尔值的数组,它实际上是一个8位无符号整数。我可以继续处理数组,但我认为这样做要比按位操作整数慢得多。此外,将整数传递给SPI接口也比数组容易得多。

有没有一种简单的方法可以将布尔数组转换成整数,或者像操作数组一样操作这些整数?

即:

代码语言:javascript
复制
bool switch[8];
switch[0] = True; //Switch 1 on
switch[1] = False; //Switch 2 off
...

等同于

代码语言:javascript
复制
uint8_t switch;
switch = 0b00000001;

但在单独的交换机中思考时,更难阅读和编程。

性能是关键,因为我的SPI需要非常快。

EN

回答 5

Stack Overflow用户

发布于 2019-04-09 18:47:31

您不能使用数组语法(这将需要操作符重载,这在C++中是可能的)。但是您可以使用一些helperfunction来设置和获取位(/ 8和%8已针对位移位和and进行了优化,请注意,这与int作为索引类型不同)

代码语言:javascript
复制
typedef uint8_t bit_mem_t;

static inline void set_bit(bit_mem_t* array, unsigned index, bool value) {
    array[index/8] = (array[index/8] | 1 << (index%8)) ^ !value << (index%8);
}

static inline bool get_bit(bit_mem_t const* array, unsigned index) {
    return (array[index/8] & 1 << (index%8)) != 0;
}

static inline void flip_bit(bit_mem_t* array, unsigned index) {
    array[index/8] ^= 1 << (index%8);
}

/*static inline size_t bit_array_size(size_t bit_count) {
    return (bit_count+7) / 8;
}*/
#define bit_array_size(bit_count) (((size_t)(count)+7)/8)

int main() {
    bit_mem_t array[bit_array_size(3)] {}; // clear it to 0s

    set_bit(array, 0, true);
    set_bit(array, 1, false);
    set_bit(array, 2, !get_bit(array, 1));
}
票数 2
EN

Stack Overflow用户

发布于 2019-04-09 18:56:59

使用uint8_t存储8位硬件相关数据,句号。如果它是一个内存映射的硬件寄存器,那么它也需要是volatile合格的。

如果你想给各个管脚命名,你可以通过定义来实现:

代码语言:javascript
复制
#define SWITCH3 (1u << 3);

使用按位运算符进行访问。

代码语言:javascript
复制
uint8_t switch = 0;
switch = SWITCH1 | SWITCH3;   // set all bits
switch |= SWITCH3;            // set a specific bit
switch &= (uint8_t)~SWITCH3;  // clear a specific bit
票数 2
EN

Stack Overflow用户

发布于 2019-04-09 18:50:30

使用宏:

代码语言:javascript
复制
uint8_t sw;
#define SW_ON(s)    sw=(sw|(1u<<(s)))
#define SW_OFF(s)   sw=(sw&(~(1u<<(s))))

并将其用作:

代码语言:javascript
复制
SW_OFF(3);
SW_ON(2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55590813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档