java逻辑运算与位运算

本文于782天之前发表,文中内容可能已经过时。

逻辑运算又称布尔运算 布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律 。

学习数据结构知识总会用到逻辑运算,所以将此知识再次巩固下,减少对学习数据结构等其它知识的障碍。

1.基本概念

逻辑常量与变量:逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态。逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合来表示,但它们之间有着本质区别,因为逻辑常量的取值只有两个,即0和1,而没有中间值。

逻辑运算:逻辑运算:在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。

2.java中的逻辑运算符和位运算符

2.1. 逻辑运算符

逻辑运算符: 逻辑与’&&’,逻辑或’||’,逻辑非’!’,逻辑异或’^’,逻辑与’&’,逻辑或’|’

逻辑运算真值表:下面的or=||wor=|

A B A&&B A or B !A A^B A&B A wor B
false false false false true false false false
true false false true false true false true
false true false true true true false true
true true true true false false true true

A和B是逻辑运算的两个逻辑变量;

两种逻辑与(&&和&)的运算规则基本相同,两种逻辑或(||和|)的运算规则也基本相同。
&和|运算是把逻辑表达式全部计算完,而&&和||运算具有短路计算功能。

对于&来说,如果左侧条件为false,也会计算右侧条件的值,而对于&&来说,如果左侧的条件为false,则不计算右侧的条件,这种现象被称作短路现象。

所谓短路计算,是指系统从左至右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况,则计算过程即被终止。
对于&&运算来说,只要运算符左端的值为false,则因无论运算符右端的值为true或为false,其最终结果都为false。
所以,系统一旦判断出&&运算符左端的值为false,则系统将终止其后的计算过程;

对于 || 运算来说,只要运算符左端的值为true,则因无论运算符右端的值为true或为false,其最终结果都为true。
所以,系统一旦判断出|| 运算符左端的值为true,则系统将终止其后的计算过程。

利用短路现象:
在程序设计时使用&&和||运算符,不建议使用&和|运算符。
注:异或相同为false,相反则为true。

2.2. 位运算符

位运算符:位与’&’,位或’|’,位非’~’,位异或’^’,右移’>>’,左移’<<’,0填充的右移’>>>’

位运算的位与’&’,位或’|’,位非’~’,位异或’^’与逻辑运算的相应操作的真值表完全相同,其差别只是位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑值boolean型。

运算规则,下面的or=||wor=|

A B A&B A wor B A^B
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0

简单的说
&:与运算。只有同为真时才为真,近似于乘法。
|:或运算。只有同为假时才为假,近似于加法。
^:异或运算。相同为假,不同为真。

位运算符说明,下面的or=||wor=|

运算符 名称 示例 说明
& 位与 x&y 把x和y按位求与
wor 位或 x wor y 把x和y按位求或
~ 位非 ~x 把x按位求非
^ 位异或 x^y 把x和y按位求异或
>> 右移 x >> y 把x的各位右移y位
<< 左移 x << y 把x的各位左移y位
>>> 右移 x >>> y 把x的各位右移y位,左边填0

下边为位&运算:

int a = 15;    //x等于二进制数的00001111
int b = 6;     //y等于二进制数的00000110
int c = x&y    //z等于二进制数的00000110
            结果为:  二进制数的00000110

右移是将一个二进制数按指定移动的位数向右移位,移掉的被丢弃,左边移进的部分或者补0(当该数为正时),或者补1(当该数为负时)。这是因为整数在机器内部采用补码表示法,正数的符号位为0,负数的符号位为1。

将一个数左移”<<”会使该值乘以2的幂。
将一个数右移>>”会使该值除以2的幂。

右移(补零)运算符,即无符号右移,”>>>”永远不会产生负号,因为其符号位总是被补零。 不论被移动数是正数还是负数,左边移进的部分一律补0。

1
2
3
4
5
6
7
8
9
10
11
 
1<<3 = 8
8>>3 = 1
int x = 70; //x等于二进制数的01000110
int y = 2;
int z = x>>y //z等于二进制数的00010001
即运算结果为z等于二进制数00010001,即z等于十进制数17
int x = -70; //x等于二进制数的11000110
int y = 2;
int z = x>>y //z等于二进制数的11101110
即运算结果为z等于二进制数11101110,即z等于十进制数-18

右移和左移操作,是整数机器数的补码表示法。
&运算符规定必须信号A和B都被充电,其结果才是充电。(1表示充电,0表示未充电)
|运算符规定只要信号A或B被充电,输出结果就是充电。
^异或(XOR)运算符规定如果信号A或B之一被充电,但是信号A和B不是同时被充电,则结果为充电。
~运算符也称为按位求补,它翻转所有的充电状态值。

想了解更多技术文章信息,请继续关注wiliam.s Blog,谢谢,欢迎来访!

欣赏此文?求鼓励,求支持!
上一篇