【发布时间】:2015-09-14 02:18:30
【问题描述】:
我正在尝试编写一个将位字段设置为某个值的函数。函数是int setField(int old, int hi, int lo, int new)。我需要它从旧值中获取位范围(lo 到hi)并用新值替换它们。替换位范围后,函数必须返回新值(十进制)。
int setField (int oldValue, int hi, int lo, int newValue)
{
int old = (oldValue >> lo) & ( (1 << hi) - 1);
int i;
for(i = lo;i<=hi;i++)
{
int a = getBit(newValue,i);
if(a == 1)
setBit(newValue,i);
if(a == 0)
clearBit(newValue,i);
}
return newValue;
}
这里是clearbit和setbit的代码
int setBit (int value, int position)
{
int a = (1<<position);
return (value | a);
}
int clearBit (int value, int position)
{
int a = (1 << position);
return (value & (~(a)) );
}
我在返回新值时遇到问题(在位被修改后)任何帮助将不胜感激。
这里也是getBit的代码
int getBit (int value, int position)
{
int a = (1<<position);
if( (value & a) == 0)
return 0;
else if( (value & a) != 0)
return 1;
}
【问题讨论】:
-
setBit和clearBit返回新值,但是当您调用它时,您并没有对结果做任何事情。 -
你也从错误的论点中得到了旧的一点。
-
您的“(十进制)”评论很奇怪——我认为您应该删除它。该值将是二进制的。
-
您可以将
getBit()简化为:int getBit(int value, int position) { return (value & (1 << position)) != 0; }。或者您可以将a保留为中间变量。
标签: c field bit bit-fields