C语言位运算的应用(2)
来源:互联网 发布:windows 8 解锁 驱动器 编辑:程序博客网 时间:2024/05/08 20:14
1,比较两个数中有多少个不同的位?
第一种方法:
分别取出两个数字的每一位,然后进行比较,不同计数器加一,可以统计出来。
int Diff_num_bit(int a, int b)//比较两个数不同位的个数{ int temp1 = 0; int temp2 = 0; int count = 0; for (int i = 0; i < 32; i++) { temp1 = a & 1; a >>= 1; for (int j = 0; j < 1; j++) { temp2 = b & 1; b >>= 1; } if (temp1 != temp2) { count++; } } return count;}
第二种方法:利用位运算来进行统计。我们知道异或运算的运算规则是相同位结果是0,不同位结果是1。
例如
int a=3;//011int b=4;//100int c=a^b;//111--->>7
我们可以统计c里面有多少个1,结果便是a,b中不同位的个数。
int Diff_num_bit(int a, int b)//比较两个数不同位的个数{ int temp = a^b; int count = 0; while (temp != 0) { count++; temp = temp&(temp - 1); } return count;}
可以看出位运算的巧妙运用可以将程序的时间复杂度和算法精简起来。
2,一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
上个问题中介绍了异或运算的规则,那么可以知道相同的数字异或运算的结果是0。所以可以利用这个特点来解决这个问题
int main(){ int arr[] = {1,2,3,1,2,3,5}; int i = 0; int ret = 0; for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { ret ^= arr[i]; } printf("%d\n", ret); return 0;}
相同的数字异或运算后结果为0,那么剩余的那个单独的数字就是要找的。
3判断整数n是否为2的正整数幂
解释:2的正整数冪就是指 2,4,8,16,32,64,128,256,512,1024,2018………….等数字。
在位运算应用(1)中,求解一个数位1的个数时候用了n&(n-1)的方法。在此重新来看这个问题
通过上图可以发现2的i次幂的数字和这个数字减一所得数字做位与运算结果位0;
依次特点和结论可以得出下面的算法代码
int ispow(int n){ if ((!(n&(n - 1))) && n >1) return 1; else return -1;}
0 0
- C语言位运算的应用(2)
- C语言-位运算的应用
- C语言位运算的应用(1)
- C语言的位运算
- c语言的位运算
- C语言的位运算
- 应用位运算 c语言实现比较:
- C001-C语言-位运算应用集合
- C语言位运算的高级应用(尤其适合单片机和嵌入式编程)
- 【C语言位运算的应用】如何按bit位翻转一个无符号整型
- C语言位运算
- C语言位运算
- C语言位运算
- c语言位运算
- C语言位运算
- c语言位运算
- C语言位运算
- c语言位运算
- 数组、链表、堆栈和队列、线性表和顺序表
- 无序链表查找
- Masonry对UIScrollView添加约束
- 简单定时器实现
- linux crontab自动化定时任务
- C语言位运算的应用(2)
- JAVA正则表达式:Pattern类与Matcher类详解(转)
- solr中文同义词检索的配置讲解
- &与&&的区别
- C#用NHibernate实现CRUD
- spring学习总结(十二):spring 中的事务管理
- 建造者模式(设计模式_14)
- C 、Java、JavaScript中的正则表达式
- 在Kettle里使用时间戳实现变化数据捕获(CDC)