Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 665|回复: 0

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

[复制链接]

该用户从未签到

发表于 2011-9-13 14:51:32 | 显示全部楼层 |阅读模式
1 位运算符
一共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。
1:关于移位运算(<< >>)的使用
左移《相当于乘以2
右移》相当于除以2
比如说,一个short类型,16位,范围是-32768~32767

如果是2左移一位就是2×2,结果是4;如果是右移就是2÷2,结果是1

但是,如果是20000 ,左移一位的结果应该是40000,但是40000超出了32767,所以你得到的结果就不会是40000了!
[/td][/tr][/table]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-5 07:42 , Processed in 0.422808 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表