剑指offer,位运算相关
2013-04-10 09:21
363 查看
位运算:
位运算一共有五种运算:& | ^ >> << ;左移位<<时,左侧值被丢弃,右面补零;右移位>>时,右面的n位被丢弃。如果是正数,则左边补0,如果是负数,则左边补符号位,即1;
一. 基本运算:
二. 剑指offer相关面试题
三. 编程之美
位运算一共有五种运算:& | ^ >> << ;左移位<<时,左侧值被丢弃,右面补零;右移位>>时,右面的n位被丢弃。如果是正数,则左边补0,如果是负数,则左边补符号位,即1;
一. 基本运算:
//1. 获得int型最大值 int getMaxInt(){ return (1<<31)-1; } int getMaxInt(){ return ~(1<<31); } int getMaxInt(){ return ((unsigned int)-1)>>1; } //2.获取int类型最小值 int getMinInt(){ return 1<<31; } //3. 获取long最大值 int getMaxLong(){ return ((unsigned long)-1)>>1; } //与2的运算: n<<1;//乘以2 n>>1;//除以2 n<<m;//乘以2的m次方 n>>m;//除以2的m次方 //奇偶性判断: (n&1) == 1; //原地交换两个变量的值 a^=b; b^=a; a^=b; //获取一个数的绝对值 (n^(n>>31)) - (n>>31)//负数>>31全变为1,即-1;n^-1,所有的数字,按位取反 //判断两个数的符号是否相同: (x^y)>=0 //2的n次方 2<<(n-1) //判断一个数是否为2的幂; (n>0)&&(n&(n-1))==0 //对2的k次方取余,n为2的次方 m&(n-1); //求两个整数的平均值 (x+y)>>1 or:((x^y)>>1)+(x&y); //从低位到高位,取n的第m位 int getBit(int n,int m){ return (n>>(m-1))&1; } //从低位到高位,将n的第m位置1 int setBitToOne(int n,int m){ return n|(1<<(m-1)); } //从低位到高位,将n的第m位置0 int setBitToZero(int n,int m){ return n&~(1<<(m-1)); } // -~n//n+1 ~-n//n-1 ~n+1; (n^-1)+1; //取相反数; //计算两个数的最大值:b&0 = 0;0|a = a;a&-1=a; int max(int a,int b){ return b&((a-b)>>31)|a&(~(a-b)>>31); } int min(int a,int b){ return a&((a-b)>>31)|b&(~(a-b)>>31); }
二. 剑指offer相关面试题
面试题10:判断一个输入数中1的个数。 //负数右移可能导致无限循环,我们改成每位与1进行位运算。 int numberOf1(int n){ int count = 0; unsigned int flag = 1; while(flag){ if(n&flag) cout++; flag = flag <<1; } return count; } //利用n&(n-1)减少一个1 int numberOf1(int n){ int count = 0; while(n){ count++; n = n&(n-1); } return count; } //面试题40:数组中只出现一次的数字 //如果一个数组中有两个数字只出现一次,其他的都出现两次,求这两个数字,要求 //时间复杂度O(n),空间复杂度O(1) //Tip:n^n = 0; void FindNumsAppearOnce(int data[],int length,int *num1,int* num2){ if(data == NULL||length <2) return; int result = 0; for(int i= 0;i<length;i++) result ^=data[i]; unsigned int indexOf1 = FindFirstBitIs1(result); *num1 = *num2 = 0; for(int j = 0;j<length;j++){ if(IsBit1(data[j],indexOf1)) *num1 ^= data[j]; else *num2 ^= data[j]; } } unsigned int FindFistBitIs1(int rusult){ int count = 0; while((result&1==0)&&(cout < 8*sizeof(int))){ result = result >>1; ++count; } return count; } bool isBit1(int num,unsigned int indexBit){ num = num >> indexBit; return num&1; } // //面试题47:不用+-完成加法运算: int Add(int num1,int num2){ int sum,carry; do{ sum = num1^num2; carry = (num1&num2)<<1; num1 = sum; num2 = carry; }while(num2 != 0) return num1; }
三. 编程之美
相关文章推荐
- 【剑指offer】位运算相关-二进制中1的个数10
- 【剑指Offer】二进制中1的个数(位运算)
- 【剑指offer】链表相关-删除value值节点
- 剑指offer面试题4:替换空格 相关题目 排序的数组A2中所有数字插入到A1并保持排序
- 剑指offer_面试题10_二进制中1的个数(位运算)
- 【剑指offer】不使用加减乘除、++、--等运算
- 剑指offer--面试题15--相关
- 剑指offer 面试题4的相关题
- 剑指offer——斐波那契数列相关问题总结
- 【剑指offer】2.4.3位运算——面试题10:二进制中1的个数
- 【剑指offer】链表相关-反转链表&&递归实现16
- 剑指offer相关题目,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符
- 剑指offer相关问题
- 剑指offer--面试题10--相关
- 剑指offer——面试题10:位运算之二进制中1的个数
- Offer题10 字母表示26进制&二进制中1的个数&位运算相关题目
- 剑指offer-面试10:二进制中1的个数(位运算)
- 剑指offer——链表相关问题总结
- 剑指offer.二进制中1的个数(位运算)
- 剑指offer--面试题21--相关