1.概念
逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律。
位运算是指以二进制位为对象的运算。在系统软件中,常要处理二进制位的问题。例如,将一个存储单元中的各二进制位左移或右移一位、两个数按位相加等。
源码,反码,补码
原码表示法在数值前面增加了一位符号位(即最高位为符号位):正该位为0,负该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
反码就是原码符号位除外,其他位按位取反。
例:+9的补码是00001001。
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 。
例:求-5的补码。
-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011),所以-5的补码是11111011。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000
2.位运算
2.1 按位取反运算 "~"
运算符为"~",将一个数据中所有位都取其相反值,即1变0,0变1。
例题:
a=(18)10 =(00010010)2 ,
则~a等于(11101101)2 ,即(237)10
在java代码中如下
public static void main(String[] args) {
long a = 18;
long b = ~a;
System.out.println(b);
b = -19
~a=(11101101)2的结果是一负数的补码,转换为原码时,第1位符号位不变,对剩余的部分先减1,再全部取反,因此得到的二进制原码为:10010011,即十进制的-19。
2.2 左移运算"<<"
左移运算的功能是将一个数据所有位向左移若干位,高位移出的部分舍去,低位自动补零。
例题:
a=(18)10 =(00010010)2 ,
a <<3的结果是(10010000)2 ,即(144)10
java程序如下
public static void main(String[] args) {
int a =18;
int b=a<<3;
System.out.println(b);
}
b=144
对于无符号数来说,在左移的过程中如果没有高位的丢失,左移1位相当于乘2,左移2位相当于乘4。
2.3 右移运算">>"
右移运算的功能是将一个数据所有位向右移若干位,右边(低位)移出的部分舍去,左边(高位)移入的二进制数分两种情况:对于无符号数和正整数,高位补0;对于负整数,高位补1。
例题:
a=(18)10 =(00010010)2 ,
则 a >>3的结果是(00000010)2,即(2)10
java程序如下
public static void main(String[] args) {
int a =18;
int b=a>>3;
System.out.println(b);
}
b=2
2.4 按位与运算"&"
例题:
运算规则为: 1&1=1 0&1=0 1&0=0 0&0=0
对于无符号数a=(173)10=(10101101)2,
b=(203)10=(11001011)2,
则a&b = (10001001)2 =(137)10
java代码如下
public static void main(String[] args) {
int a = 173;
int b= 203;
System.out.println(a&b);
}
a&b = 137
例题:
对于有符号数a=(-83)10=(10101101)2 ,
b=(-53)10=(11001011)2 ,
则a&b = (10001001)2 =(-119)10 。
以上二进制形式是负数的补码。
public static void main(String[] args) {
int a =-83;
int b =-53;
System.out.println(a&b);
}
a&b = -119
2.5 按位或运算"|"
两个运算量的各个相应位分别进行“或”运算。
运算规则为: 1|1=1 0|1=1 1|0=1 0|0=0;
例题:
对于无符号数a=(173)10=(10101101)2,
b=(203)10=(11001011)2,
则a|b = (11101111)2 =(239)10
java 代码如下
public static void main(String[] args) {
int a = 173;
int b = 203;
System.out.println(a|b);
}
a|b = 239
例题:
对于有符号数
a=(-83)10=(10101101)2,
b=(-53)10=(11001011)2,
则a|b = (11101111)2 =(-17)10
java代码如下
public static void main(String[] args) {
int a = -83;
int b = -53;
System.out.println(a|b);
}
a|b = -17
2.6 按位异或运算"^"
将两个运算量的各个相应位分别进行“异或”运算。
运算规则为: 1^1=0 0^1=1 1^0=1 0^0=0 。
对于无符号数
a=(173)10=(10101101)2,
b=(203)10=(11001011)2,
则a^b = (11101111)2 =(102)10
java代码如下
public static void main(String[] args) {
int a = 173;
int b = 203;
System.out.println(a^b);
}
a^b = 102