java中的位运算符和运算符优先级

发表于: java/j2ee | 作者: | 日期: 2014/3/27 10:03
标签:

1、位运算符
一共3个移位运算符,左移位<<,右移位>>和无符号移位>>>。左移位<<在低位处补0。右移位>>若值为正则在高位插入0,若值为负则在高位插入1。无符号右移位>>>无论正负都在高位处插入0。
~
非运算符,对各位取反。
&
与运算符,对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。(这个有问题吧。。。。)
|
或运算符,对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
^
异或运算符,对两个整型操作数中对应位执行布尔代数,两个位相等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
0000 1010 0000 0000 0000 0000 0000 0000
gives 1111 1010 0000 0000 0000 0000 0000 0000

选:B C
分析:
以下哪种运算正确:

A的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >> 4
1111 1010 0000 0000 0000 0000 0000 0000
B的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >> 4
1111 1010 0000 0000 0000 0000 0000 0000
C的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
0000 1010 0000 0000 0000 0000 0000 0000
D的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
0000 1010 0000 0000 0000 0000 0000 0000

再来一题,以下哪一运算正确:

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:

Public class test (
Public static void main (String args[]) (
System.out.printIn (6 ^ 3);
)
)

What is the output
Ans: 5
分析:
正数的原码、补码相同,故运算过程如下(省略高位0):

0110
0011
------
0101

结果为5。
2、位运算符返回的是数值,不是boolean类型值。
如:
if(5&7>0 && 5|2)
System.out.println("true");
显示:编译出错。
分析:
5|2的运算结果为数值,而不是boolean类型值,将其去掉,修改成如下,即可编译通过:

if((5&7)>0)
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 true
true false
true false

6、位运算要求操作数为整数,操作数不能是字符串也不能是小数。
如:

String s = "Hello";
long l = 99;
double d = 1.11;
int i = 1;
int j = 0;

选项:
a:j = i<
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");
}
}
结果为:True
位运算符和比较符同级别,自左向右运算即可。
如:

if(5&7>0 && 5|2)
System.out.println("true");

显示:编译出错
其中5&7最先计算,随后计算5&7结果是否大于0
[来源:http://hi.baidu.com/nbility/item/e8f5649f344c66dc1f4271c6]

: https://blog.darkmi.com/2014/03/27/2296.html

本文相关评论 - 1条评论都没有呢
Post a comment now » 本文目前不可评论

No comments yet.

Sorry, the comment form is closed at this time.