java

导航

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

来源 :中华考试网 2020-11-10

  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<

  b: j = i<

  c: j = i<

  d: j = i<

  正确:b,d

  如:

  char c = 'l';

  System.out.println(c>>1);

  编译通过,把字符值转成了int值

  Integer i = Integer("1");

  System.out.println(i>>1);

  编译无法通过

  7 由于位运算是二进制运算,不可与一些八进制数搞混,java中二进制无表示法。

  填写下面表单即可预约申请免费试听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了!

分享到

相关资讯