如何解决如何利用未使用的位节省内存?
假设我有四个unsigned char
变量,无论出于何种原因,在所有这些变量中,我都不会使用最后一位,所以我有四个位可用于另一件事,而无需需要一个额外的变量。
例如: example。如何使用那些以红色突出显示的位。
我认为我必须将数学与按位运算符一起使用,但是我不知道是否有正确或错误的方式。
注意:我正在尝试在C语言中执行此操作,因此,如果您在示例中使用C语言,我将不胜感激,但我认为其他语言的区别不会太大从C方法开始。
解决方法
您可以 进行一些调整,但是不会在内存方面节省很多,这会使您的代码更难于阅读和理解。
通过将这些值中的每一个放入具有位域的结构中,至少可以使代码更透明:
struct vars {
unsigned int var1:7;
unsigned int var2:7;
unsigned int var3:7;
unsigned int var4:7;
unsigned int extra:4;
};
,
通常,C提供了一个抽象机(以隐藏底层细节),并将您的代码转换为可能完全不同的东西。对于C抽象机; unsigned char
具有CHAR_BITS
位(可能不是8位),结构(包括位域)可能具有任何数量的额外填充(无论编译器感觉如何),等等。
如果您关心基本细节;那么您必须突破抽象。就您而言,这可能意味着(例如)使用uint32_t
并进行移动和遮蔽自己;这样就可以保证编译器将其转换为所需的内容。
示例(未经测试且相对糟糕-可以使用定义和宏):
uint32_t demoPackedValue = ((uint32_t)'a' << 24) | ((uint32_t)'b' << 16) ((uint32_t)'c' << 8) | (uint32_t)'d';
char getChar1(uint32_t packedValue) {
return packedValue & 0x0000007FUL;
}
uint32_t setChar1(uint32_t packedValue,char c) {
packedvalue = (packedvalue & 0xFFFFFF80UL) | ((uint32_t)c);
return packedvalue;
}
int getBit1(uint32_t packedValue) {
return !!(packedValue & 0x00000080UL);
}
uint32_t setBit1(uint32_t packedValue,int value) {
if(value == 0) {
packedValue &= 0xFFFFFF7FUL;
} else {
packedValue |= 0x00000080UL;
}
return packedvalue;
}
char getChar2(uint32_t packedValue) {
return (packedValue & 0x00007F00UL) >> 8;
}
uint32_t setChar2(uint32_t packedValue,char c) {
packedvalue = (packedvalue & 0xFFFF80FFUL) | ((uint32_t)c << 8);
return packedvalue;
}
当然,这也可能会损害性能(除非您拥有大量数据,并且可以证明移位/屏蔽的额外成本是合理的)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。