我正在尝试实现我已经拥有的数据压缩思想,因为我想要在大量的测试数据库中运行它,我曾想过用C编写代码(我主要有像Ruby这样的脚本语言经验) TCL).
通过关于C的O'Reilly'牛'书,我意识到我不能简单地索引一个简单的'char'或'int'类型变量的位,因为我想做按位比较和运算符.
我对这种看法是否正确?使用枚举类型表示一个位(并创建这些数组,并编写函数转换为char和从char转换)是否合理?如果是这样,是否已在某个标准库中定义了这样的类型和函数?还有其他(更好的?)方法吗?是否有人可以指示我的某些示例代码?
谢谢 -
继凯尔所说的之后,你可以使用宏来为你做艰苦的工作.
有可能的.
要设置第n位,请使用OR:
x | =(1 << 5); //设置右起第6位
要清除一点,请使用AND:
x&=〜(1 << 5); //从第6位开始清除
要翻转一下,请使用XOR:
x ^ =(1 << 5); //翻转右下角
要么...
#define GetBit(var, bit) ((var & (1 << bit)) != 0) // Returns true / false if bit is set #define SetBit(var, bit) (var |= (1 << bit)) #define FlipBit(var, bit) (var ^= (1 << bit))
然后你可以在代码中使用它:
int myVar = 0; SetBit(myVar, 5); if (GetBit(myVar, 5)) { // Do something }
有可能的.
要设置第n位,请使用OR:
x |= (1 << 5); // sets the 5th-from right
要清除一点,请使用AND:
x &= ~(1 << 5); // clears 5th-from-right
要翻转一下,请使用XOR:
x ^= (1 << 5); // flips 5th-from-right
要获得一点的值,请使用shift和AND:
(x & (1 << 5)) >> 5 // gets the value (0 or 1) of the 5th-from-right
注意:右移5是为了确保该值为0或1.如果您只对0 /非0感兴趣,则可以在没有移位的情况下完成.