LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1604|回复: 15

昨天去金山面试的一道题

[复制链接]
发表于 2010-3-20 13:26:03 | 显示全部楼层 |阅读模式
给定一个无符号整型数,试完成一个程序, 它求出这个数的二进制最高位是第几位(最低位为0)。例如,十六进制数0xFF,其最高位为第7位
我的程序如下:
  1. int get_bit(int val)
  2. {
  3.         //mod为模值,sub_val为除2后的值, bit为最高位值,作为返加值, zero_count为当前0的个数
  4.         int  mod,sub_val, bit, zero_count;   
  5.         if(val <= 0)
  6.                 return 0;
  7.         sub_val = val;
  8.         mod = bit = zero_count = 0;
  9.         while(sub_val > 0)
  10.         {                 
  11.                 mod = sub_val % 2;
  12.                 sub_val = sub_val / 2;
  13.                 if(mod != 0)
  14.                 {
  15.                         bit += zero_count + 1;
  16.                         zero_count = 0;
  17.                 }
  18.                 else
  19.                 {
  20.                         zero_count++;
  21.                 }
  22.         }
  23.         return bit - 1;
  24. }
  25. 结果他说这个程序其实可以再优化的.有些东西是可以不要的,当时我想了很久,各位能帮忙看看吗。
复制代码
发表于 2010-3-20 14:07:15 | 显示全部楼层
假设整数不超过32位:
  1. int get_bit(unsigned int val)
  2. {
  3.     int b, i;
  4.     for (b = 31, i = 1<<31; i && !(val & i); b--, i>>=1) ;
  5.     return b;
  6. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-3-20 14:21:46 | 显示全部楼层
Post by biinn;2076626
假设整数不超过32位:

  1. int get_bit(int val)
  2. {
  3.     int b, i;

  4.     for (b = 31, i = 1<<31; i && !(val & i); b--, i>>1) ;
  5.     return b;
  6. }
复制代码


够简洁,效率够高的说。。。。
回复 支持 反对

使用道具 举报

发表于 2010-3-20 14:30:15 | 显示全部楼层
这种老调的函数真是的,
自己去看kernel的__ffs函数实现,那才是真正写的好的。
回复 支持 反对

使用道具 举报

发表于 2010-3-20 14:31:12 | 显示全部楼层
更多技巧请看hacker's delight, 学C语言的必看书
回复 支持 反对

使用道具 举报

发表于 2010-3-20 14:32:17 | 显示全部楼层
这是这本书的来源,
http://graphics.stanford.edu/~seander/bithacks.html
多看看
回复 支持 反对

使用道具 举报

发表于 2010-3-20 14:53:49 | 显示全部楼层
Post by jigloo;2076631
这种老调的函数真是的,
自己去看kernel的__ffs函数实现,那才是真正写的好的。

看你求什么了;求速度,用kernel的;求空间,用我的 ;)
bty, 在我的函数中, 把 31 换成 sizeof(int) * 8 -1 就不用那个假设了。
回复 支持 反对

使用道具 举报

发表于 2010-3-20 15:13:03 | 显示全部楼层
真是的,误人子弟。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-3-20 15:29:44 | 显示全部楼层
长见识了...
果然很牛!
惭愧啊。。
回复 支持 反对

使用道具 举报

发表于 2010-3-21 02:33:36 | 显示全部楼层
Post by jigloo;2076641
真是的,误人子弟。

甭担心, 我不是老师, 误也就误一个半个...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表