java位运算应用
2015-11-25 09:23
288 查看
1. 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
2. 求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
(x&y)+((x^y)>>1);
http://blog.csdn.net/liangyihuai/article/details/50001819
3. 对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
4. 比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
x ^= y;
y ^= x;
x ^= y;
5. 求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
针对以上代码分析如下:
~1、 y = x > > 31 ;//右移31位,只保留符号位,如果是负数,则是-1,其二进制为1111 1111 1111 1111,全为1,如果是正数,则全0
~2、x^y//X与Y的异或运算,按位进行异或,当y=0时,实际上二者异或后运算的值保持不变,当Y=-1时,则实际上是将原值每位求反(1变成0,0变成1)
~3、-y//当y为0时保持不变,为-1时,则表示加1,因此
(x^y)-y当Y=0时,表示保持x不变,当y=-1时,则表示将x各位求反后加1,实际上就是对该数求负,由于原来就是负数,因此就是变成正数。
综上所述,该过程就是求绝对值。
~6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
~7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
~8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
~9. 求相反数
(~x+1)
~10 a % 2 等价于 a & 1
6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
9. 求相反数(符号位也相反了)
(~x+1)
10 a % 2 等价于 a & 1
参考自:http://www.52ij.com/jishu/102.html
a&1 = 0 偶数
a&1 = 1 奇数
2. 求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
(x&y)+((x^y)>>1);
http://blog.csdn.net/liangyihuai/article/details/50001819
3. 对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
4. 比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
x ^= y;
y ^= x;
x ^= y;
5. 求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
针对以上代码分析如下:
~1、 y = x > > 31 ;//右移31位,只保留符号位,如果是负数,则是-1,其二进制为1111 1111 1111 1111,全为1,如果是正数,则全0
~2、x^y//X与Y的异或运算,按位进行异或,当y=0时,实际上二者异或后运算的值保持不变,当Y=-1时,则实际上是将原值每位求反(1变成0,0变成1)
~3、-y//当y为0时保持不变,为-1时,则表示加1,因此
(x^y)-y当Y=0时,表示保持x不变,当y=-1时,则表示将x各位求反后加1,实际上就是对该数求负,由于原来就是负数,因此就是变成正数。
综上所述,该过程就是求绝对值。
~6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
~7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
~8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
~9. 求相反数
(~x+1)
~10 a % 2 等价于 a & 1
6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
9. 求相反数(符号位也相反了)
(~x+1)
10 a % 2 等价于 a & 1
参考自:http://www.52ij.com/jishu/102.html
相关文章推荐
- SpringMVC参数传递
- IntelliJ IDEA启动不了 legacy Java SE 6 runtime.
- 【Maven】使用eclipse maven创建一个web project
- 基于SpringMVC Annotation配置的HelloWorld
- Java Session超时设置
- 开源 java CMS - FreeCMS2.4 角色管理
- Java的二叉树排序以及遍历文件展示文本格式的文件树
- 无法直接使用Base64Encoder的问题
- 整理一下最近的收获,java中接口的使用
- 基于SpringMVC的HelloWorld实现
- java并发编程实战01--简介
- Java的native方法
- Java WebService 简单实例
- SpringMVC简介及搭建流程
- Eclipse寻找JVM的机制
- Eclipse指定JDK版本 Failed to load the JNI shared JVM.dll
- Java EE 6 体系结构图
- Java EE 7 体系结构图
- Java I/O
- 2015年11月25 Java基础系列(二)Thread Runnable线程初级讲解