gpt4 book ai didi

c - C 中的 bool 数组和按位运算

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:29 24 4
gpt4 key购买 nike

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

所以每个移位寄存器都有一个8个 bool 值的数组,其实就是一个8位无符号整数。我可以继续使用数组,但我认为这比按位操作整数要慢得多。将整数传递给 SPI 接口(interface)也比数组容易得多。

有没有一种简单的方法可以将 bool 数组转换为整数,或者以与操作数组相同的方式操作整数?

即:

bool switch[8];
switch[0] = True; //Switch 1 on
switch[1] = False; //Switch 2 off
...

相同
uint8_t switch;
switch = 0b00000001;

但是在考虑单个开关时更难阅读和编程。

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

最佳答案

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

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

关于c - C 中的 bool 数组和按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com