2 xiaolingzinia xiaolingzinia 于 2016.02.26 14:52 提问

java紧急求助,谢谢各位 1C

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?怎么算出来的的

9个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.26 21:11

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

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

括号()优先级最高。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.26 21:14

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

 n = n & (n + n) | ((1 + 2) ^( n + 3));
u012427018
u012427018   2016.02.26 16:10

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

u012427018
u012427018   2016.02.26 16:17

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

Royal_lr
Royal_lr   Ds   Rxr 2016.02.26 16:39

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

xionglangs
xionglangs   Rxr 2016.02.26 17:19

图片说明,我运行的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
这一步,我就不知道了,我感觉是先优先级位移加法运算,在进行赋值,但他的值竟然没变,可能编译器不认为这个=号是复制运算吧,所以值没有变。

Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.26 17:26

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

shanxianyue1
shanxianyue1   2016.02.27 18:16

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

shallynever
shallynever   2016.02.27 23:48

就是考察运算符优先级的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!