一周前突然发现CMU课程15-213(CSAPP)03年的lab部分,试试lab1确实挺困难,但大部分题目都是诸如"不使用'!'操作符,如何用位运算实现'!'操作" 之类没有太大意义的题目。
不过终于连搜带想的把lab1做完了。其中有几个函数还是很巧妙很实际的:
/*
返回x中第一个'1'的位置,比如leastBitPos(12) = 0x100
*/
int leastBitPos(int x)
{
return x & (~x+1);
}
|
还有避免了32次循环判断的bitCount
// Returns a count of the number of 1's in the argument.
// Examples: bitCount(5) = 2, bitCount(7) = 3
// Legal ops: ! ~ & ^ | + << >>
// Max ops: 40
// Rating: 4
int bitCount(int x)
{
int m1 = 0x11 | (0x11 << 8);
int mask = m1 | (m1 << 16);
int s = x & mask;
s += x>>1 & mask;
s += x>>2 & mask;
s += x>>3 & mask;
s = s + (s >> 16);
mask = 0xF | (0xF << 8);
s = (s & mask) + ((s >> 4) & mask);
return (s + (s>>8)) & 0x3F;
}
|
这样的函数还有很多,更多见 ,看看你能写出多少
阅读(6721) | 评论(1) | 转发(0) |