5
回答
java 基本运算的题目,让我困惑
开发十年,就只剩下这套Java开发体系了   
package com.pojo.qiuyu;


public class data13
{
public static void main(String[] args)
{
int a=15;//1111
int b=2;// 0010
//与运算规律:两个操作数中位都为1,结果才为1,否则结果为0
System.out.println("a 和b 与的结果是:"+(a&b));//0010        2
//或运算规律:两个位只要有一个为1,那么结果就是1,否则就为0
System.out.println("a 和b 或的结果是:"+(a|b));//1111        15
//非运算规律:如果位为0,结果是1,如果位为1,结果是0
System.out.println("a 非的结果是:"+(~a));//0000         0
System.out.println("b 非的结果是:"+(~b));//1101            13
System.out.println("a 和b 与非的结果是:"+(a&~b));//1101     13 
//异或运算规律:两个操作数的位中,相同则结果为0,不同则结果为1
System.out.println("a 与 b 异或的结果是:"+(a^b));    //1101  13
}

}

我运行了下,发现标红的地方结果和我先前预测的不一致(斜杠的地方是我预测的结果)

请问为啥呢?如果非运算结果不对,那我后面所有取非的结果都应该错呀


举报
共有5个答案 最后回答: 3年前

引用来自“_茶壶”的评论

java的int是有符号32位的。

但是,我这样试了下

System.out.println("a 非的结果是:"+(~a));

System.out.println("二进制1:"+Integer.toBinaryString(~a));
System.out.println("二进制2:"+Integer.toBinaryString(a));
发现打印结果是

a 非的结果是:-16

二进制1:11111111111111111111111111110000

二进制2:1111
这个二进制数是怎么表示-16的呀?我怎么感觉这个二进制应该表示一个很大的负数呀

引用来自“_茶壶”的评论

java的int是有符号32位的。

引用来自“天王盖地虎626”的评论

但是,我这样试了下

System.out.println("a 非的结果是:"+(~a));

System.out.println("二进制1:"+Integer.toBinaryString(~a));
System.out.println("二进制2:"+Integer.toBinaryString(a));
发现打印结果是

a 非的结果是:-16

二进制1:11111111111111111111111111110000

二进制2:1111
这个二进制数是怎么表示-16的呀?我怎么感觉这个二进制应该表示一个很大的负数呀

难不成这个二进制是一个补码?好像计算机系统中 都是用补码来表示的

我来计算下,根据补码转原码的规则是求反加1

1000 0000 0000 0000 0000 0000 0000 1111 +0000 0000 0000 0000 0000 0000 0000 0001

=1000 0000 0000 0000 0000 0000 0001 0000=-16

哈哈,谢谢了


顶部