gpt4 book ai didi

c - 在 C 中定义尽可能最小的宏

转载 作者:行者123 更新时间:2023-11-30 18:22:41 25 4
gpt4 key购买 nike

我想在 C 中定义一个使用少于 4 个字节的 bool 宏。我已经研究过这个,也许可以用 gcc 定义一个 asm 宏,这可能会更少。定义要小,这一点很重要,因为我将有数以万计的矩阵来保存这些 bool 值,并且重要的是它们尽可能具有内存效率。理想情况下,我想定义一个 4 位或 8 位宏来表示 true 和 false,并在 if 语句中进行计算。

编辑:

当我定义宏时

#define True 0
#define False !True

然后打印大小,它返回的是4个字节的大小,效率很低。

编辑2:

我刚刚阅读了有关位打包的内容,无论我能拥有多少位 bool 值都是最好的。我只是不太确定如何对几个位大小的敲击进行位打包。

编辑3:

#include <stdio.h>
#include <string.h>

#define false (unsigned char(0))
#define true (!false)

int main() {
if (true) {
printf("The size of true is %d\n", sizeof(true));
}
}

给出以下输出

test.c: In function ‘main’:
test.c:8:9: error: expected ‘)’ before numeric constant
test.c:9:51: error: expected ‘)’ before numeric constant

最佳答案

尝试用这个来代替你的宏:

#define false ((unsigned char) 0)
#define true (!false)

但这并不能解决您的空间需求。为了更高效的存储,需要使用位:

void SetBoolValue(int bitOffset, unsigned char *array, bool value)
{
int index = bitOffset >> 3;
int mask = 1 << (bitOffset & 0x07);

if (value)
array[index] |= mask;
else
array[index] &= ~mask;
}

bool GetBoolValue(int bitOffset, unsigned char *array)
{
int index = bitOffset >> 3;
int mask = 1 << (bitOffset & 0x07);

return array[index] & mask;
}

其中“数组”的每个值可以容纳 8 个 bool 值。在现代系统上,使用 U32 或 U64 作为阵列可能会更快,但对于较小数量的数据来说,它可能会占用更多空间。

打包大量数据:

void SetMultipleBoolValues(int bitOffset, unsigned char *array, int value, int numBitsInValue)
{
for(int i=0; i<numBitsInValue; i++)
{
SetBoolValue(bitOffset + i, array, (value & (1 << i)));
}
}

这是一个驱动程序:

int main(void)
{
static char array[32]; // Static so it starts 0'd.
int value = 1234; // An 11-bit value to pack

for(int i=0; i<4; i++)
SetMultipleBoolValues(i * 11, array, value, 11); // 11 = 11-bits of data - do it 4 times

for(int i=0; i<32; i++)
printf("%c", array[i]);

return 0;
}

关于c - 在 C 中定义尽可能最小的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697474/

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