位运算
来源:互联网 发布:javascript数组定义 编辑:程序博客网 时间:2024/06/06 17:06
位运算中设计到的操作有:与、或、非、异或、左移、右移。
题目一:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。
分析:
1.将给定的整数右移,并且判断每一次右移之后最低位是否为1.
2.设置一个flag,每次将flag左移,判断给定的整数每一位是否为1.
3.将一个数与它减一相与,会将这个数最右边的1变为0.
一、
这种解法在给定的整数是正数时可以正常得到答案,但是在给出的数是负数时,因此负数右移最高位补符号位,所以这种解法可能会引起死循环。
int numberOf1_0( int n ){ int result = 0; while ( n ) { if ( n & 1 ) ++result; n = n >> 1; } return result;}
二、
解决上一个解法出现的死循环问题的新解法。
int numberOf1( int n ){ int result = 0; unsigned int flag = 1; while ( flag ) { if ( n & flag ) { ++result; } flag = flag << 1; } return result;}
三、
令人眼前一亮的解法。
int numberOf1_2( int n ){ int result = 0; int old_n; while ( n ) { n = ( n-1 ) & n; result ++; } return result;}
结论:
把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。
拓展题目:
一、用一条语句判断一个整数是不是3的整数次方。
二、输入两个整数m和n,计算需要改变m的二进制表示中的多少次才能得到n。
阅读全文
0 0
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- AC自动机详解
- Eclipse关闭XML文件验证的方法
- php字符串处理函数大全
- 值类型和引用类型的区别,struct和class的区别
- JDK文档、枚举、包装类
- 位运算
- Shell判断字符串包含关系的方法小结
- Struts2的执行流程
- Java爬虫系列之一HttpClient【爬取京东Python书籍信息】
- 【Python3.6爬虫学习记录】(十三)在阿里云服务器上运行爬虫
- 2.1 栈的练习题
- android新开一个单线程的后台线程
- 安卓图形matrix矩阵变换的数学原理及代码
- 分享一个安装eclipse反编译工具的网址