Java中那些烦人的位运算(&,|...)
& 和 && 相同点:
都表示“与”操作。这里的“与”和数学中的“与或非”中的“与”意义相同,都遵循“一假必假”原则。即“与”符号两边的元素只要有一个为假,"与"操作执行后的结果就为假。
& 和 && 的区别:
1)
& 表示“按位与",这里的”位“是指二进制位(bit)。
例:十进制数字8 转化为二进制是:1000 ;数字9 转化为二进制是1001 。
则如有以下程序:
public class Test {
public static void main(String[] args) {
System.out.println(9 & 8);
}
}
输出结果应该是:8
原因:1001 & 1000 = 1000 。 计算机中一般1表示真,0表示假。最左边一位1&1=1,最右边一位1&0 = 0.
- && 表示逻辑”与“ ,即java中的boolean值才可以存在于&&符号的左右两侧。
true && false = false ,true && true = true , 依旧是"一假必假"。
值的注意的是:&& 符号有所谓的“短路原则”,当 A && B 出现时,如果A经判断是假,那么B表达式将不会获得执行或被判断的机会。直接结果就为假。
注:关于十进制与二进制的转换,简单的说每四位可以遵循”8421“原则,1001即8+1=9,1011即8+2+1=11
Java中的>> << >>>
<< 表示左移,不分正负数,低位补0
>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1
>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
System.out.println("16 << 1 : " + (16 << 1));
System.out.println("16 >> 3 : " + (16 >> 3));
System.out.println("16 >> 10 : " + (16 >> 10));
System.out.println("1 >> 1 : " + (1 >> 1));
System.out.println("16 >>> 2 : " + (16 >>> 2));
System.out.println("-16 >> 2 : " + (-16 >> 2));
System.out.println("-16 << 2 : " + (-16 << 2));
System.out.println("-16 >>> 2 : " + (-16 >>> 2));
打印结果
16 << 1 : 32
16 >> 3 : 2
16 >> 10 : 0
1 >> 1 : 0
16 >>> 2 : 4
-16 >> 2 : -4
-16 << 2 : -64
-16 >>> 2 : 1073741820
简单理解:
<< 1 相当于乘以2
>> 1 相当于除以2
>>> 不考虑高位的正负号,正数的 >>> 等同于 >>
|=
关于 |= 运算符:|= 运算符和 += 这一类的运算符一样,拆解开就是 a = a | b;
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a |= b; // 0000 00111
System.out.println(a);
}
具体规则为:两个二进制对应位为0时该位为0,否则为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行|运算,后三位的的对应位都不是同时等于0,所以最终结果为 0000 0111 也就是7的二进制。
&=
&= 和 |= 基本是一样的,只不过对于比较同位方式不同。
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a &= b; // 0000 0001
System.out.println(a);
}
具体规则为:两个二进制对应位都为1时,结果为1,否则结果为都0。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行&运算,只有最后一位都为1,则最终结果为 0000 0001 也就是1的二进制。
^=
运算规则还是同上。
代码如下:
public static strictfp void main(String[] args) {
int a = 5; // 0000 0101
int b = 3; // 0000 0011
a ^= b; // 0000 0110
System.out.println(a);
}
具体规则为:两个二进制对应位相同时,结果为0,否则结果为1。拿5的二进制 0000 0101 和 3的二进制 0000 0011 进行^运算,1-5位对应位都是0所以1-5位都为0,第8位都为1所以第8位也为0,其他的对应位都不相等所以为1,则最终结果为 0000 0110 也就是6的二进制。
Java中那些烦人的位运算(&,|...)的更多相关文章
- Java基础-一文搞懂位运算
在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!), ...
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- 条目六《当心C++编译器中最烦人的分析机制》
当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制. C++中的普遍规律相符,即尽可能地解释为函数声明. 把形式参数的声明用括号括起来是非 ...
- Java基础语法(语法、位运算、JavaDoc等)
一.注释.标识符.关键字 1.注释(comments) 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己编写的代码,但是当项目结构一旦复杂起来,我们就需要用到注释了! 注释并不会被程序执行, ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...
- Java中“附近的人”实现方案讨论及代码实现
前言 在我们平时使用的许多app中有附近的人这一功能,像微信.qq附近的人,哈罗.街兔附近的车辆.这些功能就在我们日常生活中出现. 像类似于附近的人这一类业务,在Java中是如何实现的呢? 本文就简单 ...
- java原码反码补码以及位运算
原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...
- java中的浮点(float)运算
一. 关于浮点运算,需要说明的几点: 1. 在java中,进行浮点运算并不会处理例外情况,所以,即使除数为0,也不会有例外被抛出; 2. 当运算结果是溢出(Infinity)时,结果为Infin ...
- java中Arrays.sort()对二位数组进行排序
int [][]a = new int [5][2]; //定义一个二维数组,其中所包含的一维数组具有两个元素 对于一个已定义的二位数组a经行如下规则排序,首先按照每一个对应的一维数组第一个元素进行升 ...
随机推荐
- [hdu5217]线段树
题意:给定一个只含'(',')'的括号序列,有m个操作,改变某个位置的括号或者询问区间[L,R]内的括号进行配对后剩下的第K个括号的位置(配对的括号从原序列中删掉). 思路:首先对于一个括号序列,进行 ...
- centos下mysql 看不到mysql数据库(密码无法更改)
1.这可能是因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿名登录的 2.解决方案 2.1.关闭mysql service mysql ...
- jbpm4.4 timer的使用
今天学习了jbpm4 的timer使用,一直测试都不成功:配置如下: <?xml version="1.0" encoding="UTF-8"?> ...
- 【雕爷学编程】Arduino动手做(59)---RS232转TTL串口模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...
- spark机器学习从0到1决策树(六)
一.概念 决策树及其集合是分类和回归的机器学习任务的流行方法. 决策树被广泛使用,因为它们易于解释,处理分类特征,扩展到多类分类设置,不需要特征缩放,并且能够捕获非线性和特征交互. 诸如随机森林和 ...
- spark机器学习从0到1支持向量机SVM(五)
分类 分类旨在将项目分为不同类别. 最常见的分类类型是二元分类,其中有两类,通常分别为正数和负数. 如果有两个以上的类别,则称为多类分类. spark.mllib支持两种线性分类方法:线性支持 ...
- 4.2 Go switch
4.2 Go switch switch语句用于基于不同条件执行不同动作,每一个case分支唯一,自上而下逐一测试,直到匹配结束,默认自动终止,不需要break. 2. switch基本语法 swit ...
- 流复制-pg_start_backup(带自定义表空间)
一.准备slave库 archive_mode = on ---开启归档模式 archive_command = 'test ! -f /mysqldata/pg/archive_active/%f ...
- select 下拉框样式修改 option文字居右
select { direction: rtl; /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #000; /*很关键:将默认的sele ...
- strut2登陆注册验证码
1. 生成图片和验证码 package com.jmu.code; import java.awt.Color; import java.awt.Font; import java.awt.Graph ...