问两个Java基础题,希望给出解释
怎么说也用了一年多的Java语言了,最近看到的两段代码怎么就看不懂呢.第一题:加注释那些结果是怎么算出来的?希望用二进制方式解释一下.publicstaticvoidte...
怎么说也用了一年多的Java语言了,最近看到的两段代码怎么就看不懂呢.
第一题:加注释那些结果是怎么算出来的?希望用二进制方式解释一下.
public static void test1(){
int n=7;
n<<=3;
System.out.println(n&n+1|n);//结果是56
System.out.println(n&n+1|n+2^n);//结果是58
System.out.println(n&n+1|n+2^n+3);//结果是57
System.out.println((n&n)+(1|n)+(2^n));//结果是171
n=n&n+1|n+2^n+3;
n>>=2;
System.out.println(n);
}
第二题:b1|b2&b3^b4这段代码执行的顺序应该是(b1|(b2&b3))^b4,其中&和|运算我还知道点,应该是不短路的逻辑运算,可boolean对boolean进行^运行是什么意思?
public static void test2(){
int x=0;
boolean b1,b2,b3,b4;
b1=b2=b3=b4=true;
//以下代码boolean对boolean进行^运行是什么意思?
x=(b1|b2&b3^b4)?x++:--x;
System.out.println(x);
}
先谢过了! 展开
第一题:加注释那些结果是怎么算出来的?希望用二进制方式解释一下.
public static void test1(){
int n=7;
n<<=3;
System.out.println(n&n+1|n);//结果是56
System.out.println(n&n+1|n+2^n);//结果是58
System.out.println(n&n+1|n+2^n+3);//结果是57
System.out.println((n&n)+(1|n)+(2^n));//结果是171
n=n&n+1|n+2^n+3;
n>>=2;
System.out.println(n);
}
第二题:b1|b2&b3^b4这段代码执行的顺序应该是(b1|(b2&b3))^b4,其中&和|运算我还知道点,应该是不短路的逻辑运算,可boolean对boolean进行^运行是什么意思?
public static void test2(){
int x=0;
boolean b1,b2,b3,b4;
b1=b2=b3=b4=true;
//以下代码boolean对boolean进行^运行是什么意思?
x=(b1|b2&b3^b4)?x++:--x;
System.out.println(x);
}
先谢过了! 展开
4个回答
展开全部
第一题:
n<<=3;
是指将n对应的二进制进行左移3位的位运算
即原来n的二进制是0111,进行运算后为0111000,对应的十进制是56
第一个运算是指n先于n+1进行二进制与运算,然后与n进行二进制位或运算
即0111000&0111001|0111000 最后的结果还是0111000 也就是56
第二个运算是指(n先于n+1进行与运算),然后与(n+2与n进行二进制位异或运算的结果)进行二进制位或运算,
即(0111000&0111001)|(0111010^0111000 )
也就是0111000|(0111010^0111000)
异或运算:a^b = a&!b + !a&b 也就是a与b异或等于a与上b的非 + a的非与上b
那么0111010^0111000 = 0111010&1000111 + 1000101&0111000 = 0000010
所以最后的结果为0111010 即十进制58
第三个运算是指(n先于n+1进行与运算),然后与(n+2与n+3进行二进制位异或运算的结果)进行二进制位或运算,
即(0111000&0111001)|(0111010^0111011 )
也就是0111000|(0111010^0111000)
异或运算:a^b = a&!b + !a&b 也就是a与b异或等于a与上b的非 + a的非与上b
那么0111010^0111000 = 0111010&1000111 + 1000101&0111000 = 0000001
所以最后的结果为0111001 即十进制57
最后一个运算是指:n先与n进行二进制位与运算,结果还是n,1与n进行二进制位或运算,那么就是0000001|0111000,结果是0111001,
2^n = 0000010^0111000 = 0000010&1000111 + 1111101&0111000 = 0111010
所以(n&n)+(1|n)+(2^n) = 0111000 + 0111001 + 0111010 = 10101011
也就是十进制171
第二题:
应该是相当于对1和0进行位运算吧
n<<=3;
是指将n对应的二进制进行左移3位的位运算
即原来n的二进制是0111,进行运算后为0111000,对应的十进制是56
第一个运算是指n先于n+1进行二进制与运算,然后与n进行二进制位或运算
即0111000&0111001|0111000 最后的结果还是0111000 也就是56
第二个运算是指(n先于n+1进行与运算),然后与(n+2与n进行二进制位异或运算的结果)进行二进制位或运算,
即(0111000&0111001)|(0111010^0111000 )
也就是0111000|(0111010^0111000)
异或运算:a^b = a&!b + !a&b 也就是a与b异或等于a与上b的非 + a的非与上b
那么0111010^0111000 = 0111010&1000111 + 1000101&0111000 = 0000010
所以最后的结果为0111010 即十进制58
第三个运算是指(n先于n+1进行与运算),然后与(n+2与n+3进行二进制位异或运算的结果)进行二进制位或运算,
即(0111000&0111001)|(0111010^0111011 )
也就是0111000|(0111010^0111000)
异或运算:a^b = a&!b + !a&b 也就是a与b异或等于a与上b的非 + a的非与上b
那么0111010^0111000 = 0111010&1000111 + 1000101&0111000 = 0000001
所以最后的结果为0111001 即十进制57
最后一个运算是指:n先与n进行二进制位与运算,结果还是n,1与n进行二进制位或运算,那么就是0000001|0111000,结果是0111001,
2^n = 0000010^0111000 = 0000010&1000111 + 1111101&0111000 = 0111010
所以(n&n)+(1|n)+(2^n) = 0111000 + 0111001 + 0111010 = 10101011
也就是十进制171
第二题:
应该是相当于对1和0进行位运算吧
展开全部
俩道题其实一样,你应该是没弄清楚运算符的优先级,
这里面有加减乘除,三元运算符,自加自减, 位运算
这几者的优先顺序:
自加自减,加减乘除,然后是位运算,三元运算符最低。
^这个符号是异或运算
这里面有加减乘除,三元运算符,自加自减, 位运算
这几者的优先顺序:
自加自减,加减乘除,然后是位运算,三元运算符最低。
^这个符号是异或运算
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1&1=1 1&0=0 0&1=0 0&0=0
1|1=1 1|0=1 0|1=1 0|0=0
1^1=0 1^0=1 0^1=1 0^0=0
>>n 除以2^n
<<n 乘上2^n
-1>>n =-1
true&true=true true&false=false false&true=false false&false=false
true|true=true true|false=true false|true=true false|false=false
true^true=false true^false=true false^true=true false^false=false
1|1=1 1|0=1 0|1=1 0|0=0
1^1=0 1^0=1 0^1=1 0^0=0
>>n 除以2^n
<<n 乘上2^n
-1>>n =-1
true&true=true true&false=false false&true=false false&false=false
true|true=true true|false=true false|true=true false|false=false
true^true=false true^false=true false^true=true false^false=false
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
位运算啊!
你搜一下google就有了。
这个东西平时用的少。是不容易记住
你搜一下google就有了。
这个东西平时用的少。是不容易记住
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询