java紧急求助,谢谢各位

package com.houlibao.www;

public class TestExample {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int n = 7;/* 00000111 */
    n <<= 3;
  System.out.println(n); /* 111000 */
    System.out.println(Integer.toBinaryString(n&n));/* 111000 */
    System.out.println(Integer.toBinaryString(n|1));/* 111001 */
    System.out.println(Integer.toBinaryString(2^n));/* 111010 */

    //  n = n&n + n|1 + 2^n ; /* 59 111011 */
    n = n&n + n|1 + 2^n +3 ;  /* 56 111000 */
    System.out.println(n);  /* 56 111000 */

}

}
http://ask.csdn.net/questions?type=reward#
为什么一个是59,一个是56?怎么算出来的的

你去看看java操作符的优先级

优先级顺序 + 大于 & 大于 ^ 大于 |

去看下这个怎么操作的就知道了,,

图片说明,我运行的2个结果都是56。<< 和<<= 都是位移运算符,但<<是进行位移运算,<<=是进行位移运算后把值赋给原来的值,比如这里的n
7<<3也就是二进制运算00000000 000000000000000000000111 7=2^(3-1)+2^(2-1)+2^(1-1),0就不用算右移3位变成了00000000000000000000000000111000,运算得56,再把56赋值给n,所以打印出来的就是56。
至于这些在这里打印的应该是二进制&就是同时为1才能为1,其余都为0,|就是同时为0才能为0,其余的都为1,^这个是异运算符,(1^1=0,0^0=0,1^0=1,0^1=0)
System.out.println(Integer.toBinaryString(00000000000000000000000000111000&00000000000000000000000000111000));/* 111000 /
这里的二进制码就没有变00000000000000000000000000111000
System.out.println(Integer.toBinaryString(00000000000000000000000000111000|00000000000000000000000000000001));/
111001 /
这里的二进制码就是00000000000000000000000000111001
System.out.println(Integer.toBinaryString(00000000000000000000000000000010^00000000000000000000000000111000));/
111010 */
这里的二进制码就是00000000000000000000000000111010
至于前面的0省略了。
n = n&n + n|1 + 2^n +3
这一步,我就不知道了,我感觉是先优先级位移加法运算,在进行赋值,但他的值竟然没变,可能编译器不认为这个=号是复制运算吧,所以值没有变。

你可以先手动算算,然后你就明白了原理

这些都是计算机基础的几种运算,<<左移位运算,&按位与,|按位或,^异或。了解这些操作的基础知识,就不难理解运行结果了。
他们优先级是:先算术运算,后移位运算,最后位运算,从高到底依次是&,^,|。
此外,表达式的结合次序取决于表达式中各种运算符的优先级,优先级高的运算符先结合,优先级低的运算符后结合。所以最后一句话等价于:

 n = n & (n + n) | (1 + 2 ^ n + 3);

括号()优先级最高。

修正下,最后一个括号里面的运算,结合顺序是,算术运算优先进行,然后才是位运算。等价如下操作:

 n = n & (n + n) | ((1 + 2) ^( n + 3));

运算符优先级的问题,就像楼上说的那样

就是考察运算符优先级的