LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: tzm529

昨天去金山面试的一道题

[复制链接]
 楼主| 发表于 2010-3-22 23:25:30 | 显示全部楼层

2楼的程序有点小错

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. }
复制代码
i>>1那里错了。
  1. int get_bit(unsigned int val)
  2. {
  3.         unsigned int b, i, s = sizeof( int) * 8 - 1;
  4.         for(b = s, i = 1<<s; i && !(val & i);b--,i>>=1);
  5.         return b;
  6. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-3-23 02:03:04 | 显示全部楼层
Post by tzm529;2077142
i>>1那里错了。
非常感谢更正!
回复 支持 反对

使用道具 举报

发表于 2010-3-23 12:23:52 | 显示全部楼层
Post by biinn;2076626
假设整数不超过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. }
复制代码


最后 return (int)b<0?0:b; 比较好, 不然如果 val 是 0 的话就不对了.
回复 支持 反对

使用道具 举报

发表于 2010-3-23 15:39:50 | 显示全部楼层
Post by tzm529;2076619
给定一个无符号整型数,试完成一个程序, 它求出这个数的二进制最高位是第几位(最低位为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. 结果他说这个程序其实可以再优化的.有些东西是可以不要的,当时我想了很久,各位能帮忙看看吗。
复制代码



  1. int get_bit(unsigned int val)
  2. {
  3.     int i=0, ret=val;
  4.     for(;ret!=0;ret &=ret-1)
  5.         {
  6.                 i++;
  7.         }
  8.     return i-1;
  9. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-3-23 15:47:21 | 显示全部楼层

  1. int get_bit(unsigned int val)
  2. {
  3.     int i=0;
  4.     for(i=0;i<32;i++)
  5.         {
  6.                 if(val&(1<<(31-i)))
  7.                 {
  8.                         break;
  9.                 }
  10.         }
  11.     return 31-i;
  12. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-3-24 00:39:30 | 显示全部楼层
val == 0 返回-1, 其他返回最高位
  1. int get_bit(unsigned int val)
  2. {
  3.     int n = sizeof(int) * 8;
  4.     while(--n >= 0 && !(val >> n));
  5.     return n;
  6. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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