嵌入式C面试题-计算无符号整形变量中1的个数
来源:互联网 发布:手机淘宝怎么退货退款 编辑:程序博客网 时间:2024/05/01 18:38
考查位运行。这已经是一个非常常见的题目了,我这里主要也是收集了多种解法。自己拿定,面试官最想看到的吧。
(1)懂C的都能写出来的方式 ,这个时间复杂度花在循环上,由位数决定
int countBit(unsigned int n)
{
int count = 0;
while(n)
{
if(n&0x1)
count++;
n>>=1;
}
return count;
}
(2)更优秀一点的,我比较喜欢的。这个时间复杂度就有了优化,与n中一的位数有关。关键技巧点在n&=(n-1). 假如随便看几位n=000101,n-1=000100. n&(n-1)=000100.所以可以看出,每次都是去掉了n中的低位的一个1.
int countBit(unsigned int n)
{
int count=0;
while(n)
{
n&=(n-1);
count++;
}
}
(3)有没有常数时间呢,当然是有的,最简单的就是想到用空间换时间。在《编程之美》里面有讲到这一方法,那是计算一个无符号8位的的值,建一个table[256],用n来做索引。这个方法 我不喜欢,想到这里,我们32位,就很难实现了,空间代价太大了。换另一种实现方式(4)吧
(4)这里就是数学的技巧和位运算的技巧了。
int countBit(unsigned int n)
{
int tmp = n;
tmp = tmp - (tmp>>1) & 033333333333
- (tmp>>2) & 011111111111;
return ((tmp+tmp>>3) & 030707070707 )% 63;
}
我觉得第(2)(4)应该会给考官好的印像。
扩展 :给定两个正整数A和B,请问至少要改变多少位,才能使A变成B。
int tmp=A^B;
countBit(tmp);
就是想要的结果。该拓展也是来自《编程之美》的问题。
- 嵌入式C面试题-计算无符号整形变量中1的个数
- 求一个无符号整形变量1的个数
- 求一个字节(8bit)的无符号整形变量,其二进制中1的个数。
- 一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数。
- 返回无符号整形的二进制数1的个数
- 对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高
- 计算整形数中1的个数
- 计算无符号整型变量的二进制中的1的个数
- 整形变量中位为1的个数
- 计算一个无符号整数的二进制中0和1的个数
- 面试题:计算n!中结尾零的个数
- 面试题---二进制中1的个数
- 面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中
- 求无符号数中1的个数
- 基于visual Studio2013解决面试题之0410计算二进制中1的个数
- 剑指offer 面试题10 计算数字中1的个数
- 剑指offer面试题10:计算二进制中1的个数
- 《剑指Offer》面试题十之计算二进制数中 1 的个数
- Macbuntu 一款将Ubuntu变成飘漂亮华丽动人的Mac风格!,体验Mac dock的动感画面
- thinkphp 表单令牌错误解决方法,去掉部分表单令牌验证
- Linux_S3C2440_CAMIF接口驱动程序(一)驱动和系统相关的学习
- android 按钮点击效果的实现
- 结婚五年,重逢爱情
- 嵌入式C面试题-计算无符号整形变量中1的个数
- Android 中使用session机制保存用户信息
- select 多字段模糊查找
- iOS---沙盒
- C++ STL set_union的用法
- Android JNI NDK 编程学习
- 设置DateTimePicker为空
- B2B2C商城,数据库设计,希望高人指点,问题在哪?
- 黑马程序员_GUI