(续)关于位运算
来源:互联网 发布:scopus数据库免费吗 编辑:程序博客网 时间:2024/05/16 01:34
一组数据中,只有一个数只出现了一次,其余数字都是成对出现的,找出这个数字。
#include <stdio.h>#include <stdlib.h>int main(){int arr[] = {1,2,3,4,4,5,3,2,1};int sz = sizeof(arr)/sizeof(arr[0]); int i = 0;int ret = 0;for(i=0; i<sz; i++){ret ^= arr[i];}printf("%d\n",ret);system("pause");return 0;}
进阶版本:
一个数组中只有两个数只出现了一次,其余数都是成对出现的,找出这两个数字。
int main(){int arr[] = {1,2,3,4,5,6,1,2,3,4};int num1 = 0;int num2 = 0;int i = 0;int pos = 0;int ret = 0;int sz = sizeof(arr)/sizeof(arr[0]);for(i=0; i<sz; i++){ret ^= arr[i]; //ret为数组中唯二的两个单独的数相异或得到的值}for(i=0; i<32; i++){if(((ret>>i) & 1) == 1)pos = i; //pos位为ret中值为1的最低位}for(i=0; i<sz; i++){if(((arr[i] >> pos) & 1) == 1) //通过pos找到两个单独的数中的一个num1 ^= arr[i];}num2 = ret ^ num1;printf("%d %d\n",num1,num2);system("pause");return 0;}
对数据的比特位的操作:
实现对一个8bit位数据的指定为的置0或者置1操作,并保证其他位不变。
#include <assert.h>int bit_set(unsigned char *p_data,unsigned char pos,int flag)//p_data 指定需要操作的数据; pos 指定位(1~8); flag 置0或者置1{unsigned char tmp = 0;assert(p_data);assert((pos >= 1) && (pos <= 8)); tmp = (1 << (pos-1));if(flag == 0){tmp = ~tmp;*p_data &= tmp;}else{*p_data |= tmp;}return *p_data;}int main(){int num = 10;int ret = bit_set(&num,3,1);printf("%d\n",ret);system("pause");return 0;}
使用位操作符的时候要注意它的优先级,避免错误的一个好习惯是选择带上括号。
0 0
- (续)关于位运算
- 关于位运算(转需)
- 关于二进制和位运算(小结)
- 关于位运算
- 关于位运算
- 关于位运算!~
- 关于位运算
- 关于位运算
- 关于位运算
- 关于位运算
- 关于位运算
- 关于java位运算
- 关于 位运算
- 关于键盘,位运算
- 关于位运算
- 关于JAVA 位运算“<<” ">>"
- 关于位运算 & | << >> ^ ~ %
- 关于位运算
- CCF 201612-1 中间数 JAVA实现
- 【LeetCode-229】Majority Element II(C++)
- 47 leetcode - Combination Sum III
- Android Studio快捷键之相见恨晚的操作锦集
- Linux一些常用命令
- (续)关于位运算
- 把JAVA项目部署到LINUX服务器中
- 1613-3-傅溥衍 总结《2016年12月20日》【连续第八十一天总结】
- JavaEE-JSP
- 算法 -- iOS开发用Objective_C / Swift3.0实现:直接插入排序 / 二分法插入排序 / 希尔排序
- <3>CDialog::DoModal()问题和_WIN32_WINNT
- Linux下打包压缩文件
- 远程连接Windows Server2008 未安装任何音频输出设备 启用声音音频解决 声音问题
- RunLoop的学习总结