gpt4 book ai didi

c - 要计数到 CHAR_BIT 的位数

转载 作者:行者123 更新时间:2023-11-30 14:47:36 25 4
gpt4 key购买 nike

我有一个用 C 语言实现的位 vector ,我想避免除法和模数运算,并用(更快的)位运算替换它们。因此,我将位放入字节(字符)中,并需要索引到这些数组中,然后取出一些位。我的实现如下所示:

#include <limits.h>  // For CHAR_BIT
#include <stdbool.h> // For defintion of bool

// Number of bytes to represent n bits.
// FIXME: 3 should be log_2(CHAR_BIT).
#define BV_SIZE(n) (((n) >> 3) + 1)

// Remove last byte (divice by CHAR_BIT, i.e. shift by log_2(CHAR_BIT) bits)
// FIXME: 3 should be log_2(CHAR_BIT).
#define BV_CHAR_INDEX(i) ((i) >> 3)
// Mask out last byte (CHAR_BIT bits)
#define BV_LAST_CHAR_MASK (CHAR_BIT - 1)
// Extract which bit index we have
#define BV_BIT_INDEX(i) ((i) & BV_LAST_CHAR_MASK)
// Get the mask for that bit
#define BV_BIT_MASK(i) (1 << BV_BIT_INDEX(i))

// Getter and setter for bits in vector bv
#define BV_GET_BIT(bv, i) ((bool)((bv)[BV_CHAR_INDEX(i)] & BV_BIT_MASK(i)))
#define BV_SET_BIT(bv, i) ((bv)[BV_CHAR_INDEX(i)] |= BV_BIT_MASK(i))
#define BV_UNSET_BIT(bv, i) ((bv)[BV_CHAR_INDEX(i)] &= ~BV_BIT_MASK(i))

问题是两个 FIXME,其中我移动 3 位以获得代表 n 位的字符数,以及我获取可以找到一个位的字符数组的索引。我不太介意 BV_SIZE 中的划分因为我不经常分配位 vector ,但我想在索引到 vector 时避免它。

有没有通用的方法来获取我需要计数到 CHAR_BIT 的位数?我已经将 8 位硬连线到 CHAR_BIT ,并且在我工作的所有架构上都是如此,但如果不是这样,我可以在编译时获得这个数字吗?

编辑:我当然可以使用 uint8_t为我的字节然后定义

#define BV_BITS_PER_BYTE 8
#define BV_BITS_TO_INDEX_A_BYTE 3

并使用前者代替 CHAR_BIT后者而不是 3。我仍然很好奇是否有一种方法可以获取我需要计数到一个字节的位数,而无需为此构建表格......?

最佳答案

The problem is the two FIXMEs where I shift by 3 bits to get the number of chars to represent n bits and where I get the index into the char array where a bit can be found.

别再耍小聪明了,除以 CHAR_BIT 即可。如果合适的话,编译器会将其实现为转变。

关于c - 要计数到 CHAR_BIT 的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51096577/

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