博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用位运算
阅读量:2353 次
发布时间:2019-05-10

本文共 2478 字,大约阅读时间需要 8 分钟。

一直很想用位运算来写代码,奈何自己没有好好学习计算机基础,接下来想好好学习这些基础。现在先贴出一些常用的位运算,希望能对自己有点帮助!

//1.获得int型最大值void getMaxInt(){         int MaxInt1= (1 << 31) - 1;//由于优先级关系,括号不可省略         int MaxInt2=~(1<<31);//~是取反运算        int MaxInt3=(1 << -1) - 1;//部分编译器不支持        int MaxInt4=((unsigned int) - 1) >> 1;//不知道int占几个字节时候}  //2.获得int型最小值void getMinInt(){      int MinInt1= 1 << 31;//-2147483648      int MinInt2= 1 << -1;//-2147483648,有些编译器不支持 }  //3.获得long类型的最大值long getMaxLong(){      return ((unsigned long) - 1) >> 1;//2147483647  }  //4.乘以2运算int mulTwo(int n){
//计算n*2 return n << 1; } //5.除以2运算int divTwo(int n){
//负奇数的运算不可用 return n >> 1;//除以2 } //6.乘以2的m次方int mulTwoPower(int n,int m){
//计算n*(2^m) return n << m; } //7.除以2的m次方int divTwoPower(int n,int m){
//计算n/(2^m) return n >> m; } //8.判断一个数的奇偶性bool isOddNumber(int n){ return (n & 1) == 1; } //9.不用临时变量交换两个数void swap(int *a,int *b){ (*a) ^= (*b) ^= (*a) ^= (*b); //}//9,不用临时变量交换两个数通用版void swap(int *a,int *b){ *a ^= *b; *b ^= *a; *a ^= *b; //分析 //*b=*b^*a,而此时的*a=*a^*b,所以*b=*a^*b^*b 因为异或运算,相关的位异或为0,所以*b^*b等于0,所以*b=*a; //同理可以得出*a=*b;}//10.取绝对值(某些机器上,效率比n>0 ? n:-n 高)int abs(int n){ return (n ^ (n >> 31)) - (n >> 31); /* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1 若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算, 结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */ } //11.取两个数的最大值int max(int x,int y){ return x ^ ((x ^ y) & -(x < y)); //如果x
= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。 } //14.计算2的n次方int getFactorialofTwo(int n){
//n > 0 return 2 << (n-1);//2的n次方 } //15.判断一个数是不是2的幂bool isFactorialofTwo(int n){ return n > 0 ? (n & (n - 1)) == 0 : false; } //16.对2的n次方取余int quyu(int m,int n){
//n为2的次方 return m & (n - 1); } //17.求两个整数的平均值int getAverage(int x, int y){ return (x + y) >> 1; }//18.从低位到高位,取n的第m位int getBit(int n, int m){ return (n >> (m-1)) & 1; } //19.从低位到高位.将n的第m位置1int setBitToOne(int n, int m){ return n | (1 << (m-1)); /*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/ } //20.从低位到高位,将n的第m位置0int setBitToZero(int n, int m){ return n & ~(1 << (m-1)); /* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/ } 21、清除n最右边的1:n&n-1当n为奇数,二进制表示的末位为1: n: xxxxxxxx1 n-1: xxxxxxxx0 n&(n-1): xxxxxxxx0 相当于去掉最右边的一个1。 当n为偶数且不等于0,二进制表示的末位为0: n: xxxxx1000 n-1: xxxxx0111 n&(n1-): xxxxx0000 相当于去掉最右边的一个1。 22、取得n最右边的1:n&-n-n的补码可以这样得到:找到n最右边出现的1,该位不变,然后这个1左边的所有位取反。那么n&-n等于得到刚刚那个1。

转载地址:http://aarvb.baihongyu.com/

你可能感兴趣的文章
Widget.Material.Light.ProgressBar.Horizontal" (10302b8) is not a Drawable (color or path)错误解决
查看>>
解决java中文乱码,编码识别测试,汇总
查看>>
android定时,延时,倒计时源码
查看>>
Eclipse导入项目时常见问题解决汇总, Android Studio转为Eclipse项目问题汇总
查看>>
com.android.dex.DexIndexOverflowException
查看>>
AndroidStudio一个工程内查看多个项目的实现
查看>>
Gradle Build速度加快终极方法
查看>>
Could not find class 'com.umeng.analytics.d' 解决的方案分享
查看>>
谷歌游览器模拟手机请求网站测试
查看>>
在Fragment中OnActivityResult方法中接收Activity中返回的值
查看>>
外包采用Gradle生成多套app打包
查看>>
iOS和Android的app界面设计规范
查看>>
Android 代码混淆异常
查看>>
Android drawable微技巧,你所不知道的drawable的那些细节
查看>>
理解Fragment生命周期
查看>>
最靠谱的禁止ViewPager滑动方法
查看>>
android错误之android.content.res.Resources$NotFoundException:
查看>>
Android监听软键盘打开收起事件(软键盘自带收起按钮)
查看>>
huffman code and encode
查看>>
exception in c++
查看>>