程序中位运算的妙用
来源:互联网 发布:电脑数据怎么恢复 编辑:程序博客网 时间:2024/06/06 05:17
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位运算。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制110,11的二进制是1011,那么6 and 11的结果就是2(0010),它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理,同1为1,其余全为0)。位运算相较于其他计算符来讲,由于是直接使用计算机的方式来处理数据,无疑会被计算机更快的识别处理,提高程序运行速度。
1
~
2
<<、>>
3
&
4
^
5
|
6
&=、^=、|=、<<=、>>=
以上是位运算的优先级和种类。下面举一些位运算的小例子:
1.&的妙用
if((n&1) == 1) { System.out.println("n为奇数"); }n&1是n和1做"按位与"运算,1的二进制只有末位是1,所以n&1就是只保留n的末位(二进制).n&1就表示了n的奇偶性.n若为偶数,其二进制表示最后一位一定为0,所以与1相与得0,而奇数则相反,其二进制最后一位一定为1,所以与1相与得1,这样就可以判断一个数的奇偶性,而不是使用%2的方法来判断。
2.<< 和 >>的秒用
public class exercise{ public static void main(String[] args) { int i=4; int j=6; System.out.println(i<<1); System.out.println(j>>1); }}向左移相当于一个数乘2,向右移相当于除2,例如上面的4(省略到只有四位0100),向左移一位,就变成了8(1000),而6(0110),向右移一位则变为了3(0011)。
3^(异或)的妙用
public class exercise3 {public static void main(String[] args) {int i=-4;int j=6;boolean isNeg = (i^j)>>>31 == 0;if(isNeg){System.out.println("i,j同号");}else{System.out.println("i,j异号");}}}异或的规则是同0异1,通常和>>>(无符号右移)搭配使用,>>表示有符号右移,如果该数为正,则高位补0,若为负数,则高位补1;>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。int类型32位,无符号右移31位则只剩下符号位,进行异或便可知道两数是不是同号。而且这样写最大的好处是不需要考虑数值越界的问题。
大概比较常用的有这几个,以后再进行补充。
阅读全文
1 0
- 程序中位运算的妙用
- 位运算的妙用
- 位运算的妙用
- 位运算的妙用
- 位运算的妙用
- “位运算”在程序开发中的妙用!
- Java中位运算符妙用
- 关于位异或运算的妙用
- 位运算n & (n-1)的妙用
- 位运算n & (n-1)的妙用
- 位运算妙用1
- 位运算妙用2
- 按位运算妙用
- 【总结】位运算和数值运算的妙用
- C语言位运算妙用
- n&(n-1)的妙用(强大的位运算)
- JS中与或运算的妙用
- android源码中&运算符的妙用
- CSS content换行技术实现字符animation loading效果
- BZOJ 2756 SCOI2012 奇怪的游戏
- RecyclerView item按下变色效果
- 关于Linux路由表的route命令
- 最大相连子序列和及相应的下标
- 程序中位运算的妙用
- JS中this的指向
- 人脸识别和跟踪程序
- 负载均衡之HTTP重定向
- 1758:二叉树(3.6数据结构之二叉树)
- 下载了一个vue项目如何运行
- 编译ffmpeg出现missing separator.Stop.
- mybatis查询结果为Map类型
- 从网络上获取ImageLoader并且ListView上展示