作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 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/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!