一共3个移位运算符,左移位<<,右移位>>和无符号移位>>>。左移位<<在低位处补0。右移位>>若值为正则在高位插入0,若值为负则在高位插入1。无符号右移位>>>无论正负都在高位处插入0。
非运算符~
&对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。
^对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。
|对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
如:
以下哪种运算正确:
A. 1010 0000 0000 0000 0000 0000 0000 0000 >>4
gives 0000 1010 0000 0000 0000 0000 0000 0000
B. 1010 0000 0000 0000 0000 0000 0000 0000 >>4
gives 1111 1010 0000 0000 0000 0000 0000 0000
C. 1010 0000 0000 0000 0000 0000 0000 0000 >>>4
gives 0000 1010 0000 0000 0000 0000 0000 0000
D. 1010 0000 0000 0000 0000 0000 0000 0000 >>>4
gives 1111 1010 0000 0000 0000 0000 0000 0000
选:B C
以下哪一运算正确:
A. 0000 0100 0000 0000 0000 0000 0000 0000 <<5
gives 1000 0000 0000 0000 0000 0000 0000 0000
B. 0000 0100 0000 0000 0000 0000 0000 0000 <<5
gives 1111 1100 0000 0000 0000 0000 0000 0000
C. 1100 0000 0000 0000 0000 0000 0000 0000 >>5
gives 1111 1110 0000 0000 0000 0000 0000 0000
D. 1100 0000 0000 0000 0000 0000 0000 0000 >>5
gives 0000 0110 0000 0000 0000 0000 0000 0000
选:A C
Given:
1.Public class test (
2. Public static void main (String args[]) (
3. System.out.printIn (6 ^ 3)
4.)
5.)
What is the output
Ans: 5
2 位运算符返回的是数值,不是boolean类型值
如:
if(5&7>0 &&5|2)
System.out.println("true")
显示:编译出错
3 对于一个整型数进行移位,其右操作数应该小于32,对于一个长整型数进行移位,其右操作数应该小于64。如果右操作数大于了规定的位数,编译不会报错,取右操作数的模来进行移位操作。
如:
class Test
{
public static void main(String args[])
{
int x= 16384
System.out.println(x>>33)
}
}
显示:8192
4 注意进行位操作时,会自动转成int型,转换之后,可接受右操作数长度为32。进行位运算时,总是先将短整型和字节型值转换成整型值再进行移位操作的。
如:
class Test
{
public static void main(String args[])
{
byte x = 127
byte y = (byte)(x>>9)
System.out.println(y)
}
}
显示:0
如:
char c = 'l'
System.out.println(c>>1)
编译通过,把字符值转成了int值
5 boolean类型值true对应位值1,false对应位值0,返回仍然是boolean类型。&,|,^,都可以用于布尔值,但是~不能用于布尔值。
布尔类型true,false可以比较,但只有==能使用,<,<=...会产生编译错误。除此外,布尔类型不能和其他类型数值比较。
如:
class Test
{
public static void main(String args[])
{
boolean x = true
boolean y = false
System.out.println((x&y) + " " + (x&x))
System.out.println((x^y) + " " + (y^y))
System.out.println((x|y) + " " + (y|y))
}
}
显示:false ture true false false true true false
6 位运算要求操作数为整数,操作数不能是字符串也不能是小数。
如:
String s = "Hello"
long l = 99
double d = 1.11
int i = 1
int j = 0
a:j = i<<s
b: j = i<<j
c: j = i<<d
d: j = i<<l
正确:b,d
如:
char c = 'l'
System.out.println(c>>1)
编译通过,把字符值转成了int值
Integer i = Integer("1")
System.out.println(i>>1)
编译无法通过
7 由于位运算是二进制运算,不可与一些八进制数搞混,java中二进制无表示法。
如:
System.out.println(010|4)
显示:12
并且当位运算中遇见负数,必须把它转成补码再进行计算。而不是使用原码。
如:
class Test
{
public static void main(String args[])
{
try
{
int x = -7
System.out.println(x/2 + " " + (x >>1))
}
catch(Exception e)
{
System.out.pritnln("Exception")
}
}
}
a A compiler error
b Exception
c -3 -3
d -3 -4
e -4 -4
f None of the above
选:f
-7>>1:-7补码:11111111 11111111 11111111 11111001
随后操作得: 11111111 11111111 11111111 11111100
关于-7/2,其中仍与正数除法相同,为-3。
如:
int a = -1
int b = -1
a = a >>>31
b = b >>31
显示:a=1,b=-1
其中b处,高位插入1,是插入31个,是一32个1,这是一个补码,随后转成十进制为-1。
稍复杂的如:
int i = 1
i <<= 31
i >>= 31
i >>= 1
int j = 1
j <<= 31
j >>= 31
System.out.println("i=" + i)
System.out.println("j=" + j)
显示:i=-1 j=-1
i<<=31 : 1000 0000 0000 0000 0000 0000 0000 0000 //这里已经被当作负数了
i>>=31 : 1111 1111 1111 1111 1111 1111 1111 1111
i>>=1 : 1111 1111 1111 1111 1111 1111 1111 1111
8 对于~操作,可以根据计算机中二进制正负数之间的关系,采取取负减一法,即~i = (-i)-1.
如:
int i = 45678
int j = ~i
System.out.println(j)
结果:(-45678)-1 = -45679
如:
class Test
{
public static void main(String args[])
{
int x = 1
int y = ~x+1
System.out.println(x+" "+y)
}
}
显示:1 -1
9 运算符优先级和运算顺序:运算顺序从左至右,赋值顺序从右至左。
class Test
{
public static void main(String args[])
{
int [] refToArray = { 10, 11}
int var = 1
refToArray[var-1] = var = 2
System.out.println(refToArray[0] + " " + refToArray[1])
}
}
如上输出为2和11,首先计算数组下标,随后赋值。
运算符== 的优先级高于赋值运算符=的优先级。
如:
public class Test
{
public static void main(String args [])
{
int i = 10
int j = 10
boolean b = false
if(b=i==j)
System.out.println("True")
else
System.out.println("False")
}
}
位运算符和比较符同级别,自左向右运算即可。
如:
if(5&7>0 &&5|2)
System.out.println("true")
显示:编译出错
其中5&7最先计算,随后计算5&7结果是否大于0。
布尔型..即true与false.java 表达式,由变量,literal和运算符号组合而成.java 总共提供大约30种操作符.下面一一介绍.
1、算术运算
算术运算符有+,-,*,/,% 五种。对于整数来说,算术运算符得到的结果只会是int,为什么呢?因为怕运算完后的结果会超出原来数据类型的范围.
2、比较运算
比较运算符有大于(>),小于(<),大于等于(>=),小于等于(<=),等于(==)和不等于(!=).比较运算的结果一定只有两种,true或false,也就是boolean类型的literal.
不是只有数据才能比较大小,字符也可以,另外等于和不等于也可以用在非基本数据类型之间,如类,对象,字符串,数组等.String的比较不能直接用==.因为它是一个类,不是一种数据类型.
3、逻辑运算
逻辑运算符有与“&&”,或“||”,非“!”,其中“”和“”是短路逻辑操作符。逻辑运算还有“&”“|”“^”等三个按操作符。
4、递加、递减运算
递加“++”,递减“--”,这个与C的语法一样,在使用递加、递减时要特别注意它是放在变量的前面还是后面。如果是如“++a”,java会先将a的值加加,再把新的数值拿去做别的运算。而如果是“a++”的话相反,先把a的值拿去做运算后再将a的值++写入内存。“--”的做法也是一样。
5、赋值运算
“=”是赋值操作符。通常把“=”称为赋值,而不称作等于。赋值操作符的优先级是所有操作符中最低的.还要注意赋值运算的自动类型转换是放大类型转换,不是缩小类型转换,否则编译时要报错.
6、位运算
其中三种“&”“|”“^”其实已经在逻辑运算中提到,另外还有就是互补“~”,“~”有点像逻辑非“!”,只不过“!”用在boolean类型,而“~”用在int类型,也就是按位取反。
7、位移运算
右移“>>”和左移“<<”。另外还有无符号的右移“>>>”,跟右移运算类似,不过不管正负数,全在左边缺少的地方补0,注意它只能用在int,long。
综上,表达式有双重功能,执行表达式的运算和返回值。下表说明了Java操作符的优先级:
后缀操作符 [] . (params) expr++ expr--
一元操作符 ++expr --expr +expr -expr ~ !
新建 new (type)expr
乘除 * / %
加减 + -
移位 <<>>>>>
关系 <><= >= instanceof
等 == !=
位与 &
位异或 ^
位同或 |
逻辑与 &&
逻辑或 ||
条件 ? :
赋值 = += -= *= /= %= &= ^= |= <<= >>= >>>=