Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117254
  • 博文数量: 24
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 261
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 17:49
文章分类

全部博文(24)

文章存档

2009年(24)

我的朋友

分类:

2009-09-09 15:19:13

一周前突然发现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) |
给主人留下些什么吧!~~

halida2009-09-28 17:47:30

上面那道题我google了才知道怎么做。其实对于资深C语言程序员来说不成问题的。。。