3 回答
TA贡献1866条经验 获得超5个赞
位域并不像您想象的那样可移植,因为“ C不能保证机器字内的字段顺序”(The C book)
忽略这一点,正确使用任何一种方法都是安全的。两种方法都允许符号访问整数变量。您可以争辩说,位域方法更易于编写,但也意味着需要查看更多代码。
TA贡献1825条经验 获得超6个赞
如果问题在于设置和清除位容易出错,那么正确的做法是编写函数或宏以确保正确执行。
// off the top of my head
#define SET_BIT(val, bitIndex) val |= (1 << bitIndex)
#define CLEAR_BIT(val, bitIndex) val &= ~(1 << bitIndex)
#define TOGGLE_BIT(val, bitIndex) val ^= (1 << bitIndex)
#define BIT_IS_SET(val, bitIndex) (val & (1 << bitIndex))
如果您不介意val必须是左值(除BIT_IS_SET以外),这将使代码可读。如果那不能使您满意,那么您可以取出作业,用括号括起来并用作val = SET_BIT(val,someIndex); 这将是等效的。
确实,答案是考虑将您想要的东西与想要的方式脱钩。
TA贡献1799条经验 获得超6个赞
您必须从作家的角度考虑这一点-了解您的听众。因此,需要考虑几个“受众”。
首先是经典的C程序员,他们掩饰了自己的一生,并且可以在睡眠中做到这一点。
第二个是新手,他不知道||和东西是什么。他们在上一份工作中编程php,现在为您工作。(我说这是做PHP的newb)
如果您写的是要满足第一批读者(全天都是位掩码)的话,那么会让他们感到非常高兴,并且他们将能够被蒙住眼睛。但是,新手可能需要克服庞大的学习技巧,才能维护您的代码。他们将需要了解二进制运算符,如何使用这些操作来设置/清除位,等等。您几乎肯定会因为newb引入了bug,因为他/她需要所有的技巧才能使其正常工作。
另一方面,如果您为了满足第二个读者而写作,则新手将可以更轻松地维护代码。他们会有更轻松的时光
flags.force = 0;
比
flags &= 0xFFFFFFFE;
最初的听众会变得脾气暴躁,但是很难想象他们将无法理解和维护新的语法。搞砸起来要困难得多。不会有新的错误,因为newb可以更轻松地维护代码。您将获得有关“如何回想起我今天需要稳定的手和磁化的针来设置位...我们什至没有位罩!”的讲座。(感谢XKCD)。
因此,我强烈建议使用位掩码上的字段来使代码安全。
- 3 回答
- 0 关注
- 581 浏览
添加回答
举报