剑指offer-位运算
来源:互联网 发布:qe 知乎 编辑:程序博客网 时间:2024/06/11 08:32
在对unsigned类型的无符号值进行右移位时,左边空出的部分用0补齐,而对于带符号值移位左边用符号位补齐。
问题1.实现函数getbits(unsigned x,int p,int n),返回x中从右边数第p位开始向右数n位的字段。例如get(x,4,3),返回x中第4,3,2位的值.
unsigned getbits(unsigned x,int p,int n){ //x=10111;p=4,n=3时,返回011 x=x>>p-n; //右移1位,将需要提取的数据放在最右边3位 unsigned k=~(~0<<n); //获取最右边三位的掩码 return x&k;}
问题2.设置某一位为1或者0
void setBit1(unsigned &x, int p){ //对于x=10111,p=4 =》x=11111; x |= (1 << p - 1);}void setBit0(unsigned &x, int p){ //对于x=10111,p=4 =》x=11111; x |= ~(1 << p - 1);}
问题3.二进制中1的个数
int Numberof1(int x){ int sum=0; while(x){ sum++; x=x&(x-1); } return sum;}
问题4.不用加减乘除做加法:写一个函数,求两个整数之和
//1.先直接二进制相加,不进位//2.进位//3.重复前面两步,知道不产生进位为止int Add(int num1,int num2){ int sum; int carry=0; do{ sum=num1^num2; carry=(num&num2)<<!; num1=sum; num2=carry; }while(num2!=0); return num1;}
问题5.位运算实现求平均值的表示方法 ((x&y)+(x|y))>>1;
注意运算符的优先级
问题5、数组中只出现一次的数字
void PrintAppearOnceNum(int a[],int n){ int Hashtable[1000]; memset(Hashtable,0,sizeof(Hashtable)); for(int i=0;i<n;i++){ Hashtable[a[i]]++; } for(int i=0;i<1000;i++) if(Hashtable[a[i]]==1) cout<<a[i]<<endl;}//如果只有一个数字出现一次,其他数字都出现了2次,这么找int FindNum(int a[],int n){ int key=0; for(int i=0;i<n;i++){ key^=a[i]; } return key;}//如果只有两个数字各出现一次,其他数字均出现两次,怎么找出这两个数字void FindNumAppearOnce(int a[],int n){ int key=0; for(int i=0;i<n;i++){ key^=a[i]; } unsigned indexof1=FindFirstBit1(key); int num1=0; int num2=0; for(int j=0;j<n;j++){ if(IsBit1(a[j],indexof1)) num1^=a[j]; else num2^=a[j]; } cout<<num1<<" "<<num2<<endl;}unsigned FindFirstBit1(int num){ int indexBit1=0; for(;indexBit<8*sizeof(int)&&(num&0x1)==0;indexBit1++){ num=num>>1; } return indexBit1;}bool IsBit1(unsigned num,int indexBit){ num=num>>indexBit-1; return (num&0x01); }
0 0
- 【剑指Offer】位运算
- 剑指offer-位运算
- 剑指offer,位运算相关
- 剑指Offer之面试位运算总结
- 剑指offer 算法 (位运算)
- 剑指offer中位运算技巧
- 剑指offer--位运算(22、34、63)
- 剑指offer: 二进制中1的个数(位运算)
- 【剑指Offer】二进制中1的个数(位运算)
- 剑指offer——另类加法__(位运算)
- 剑指offer笔试面试题之——位运算
- 移位运算-《剑指offer》2.4.3位运算读后整理
- 剑指offer面试题10 二进制中1的个数(位运算专题)
- 【剑指offer】位运算相关-二进制中1的个数10
- 剑指offer 2.4 位运算,求二进制中1的个数
- 【剑指offer】2.4.3位运算——面试题10:二进制中1的个数
- 《剑指offer》:[14]位运算以及求二进制中1的个数
- 剑指offer-面试10:二进制中1的个数(位运算)
- android音频hal层简介
- TabLayout——浅谈
- [深入理解Android卷二 全文-第一章]开发环境部署
- java基础部分
- Android之ClipDrawable资源简单使用
- 剑指offer-位运算
- Shortest Prefixes
- 修改SSH的端口
- urllib2使用总结
- [深入理解Android卷一全文-第十章]深入理解MediaScanner
- OGNL
- Hat’s Words
- 如何学会傅里叶变换?
- [深入理解Android卷一全文-第九章]深入理解Vold和Rild