关于按位与的思考,请教擅长逻辑的或技术大牛帮看下,直接上过程

a825395336 2014-11-13 11:55:00
public class TestAndandOr2 {
public static void main(String[] args) {

// 目标
// 120 -120
// 0111 1000 1000 1000
byte positive = 120;
byte negative = -120;

// 掩码
// 0x00 0xff
// 0000 0000 1111 1111
int bytemask0 = 0x00;
int bytemask255 = 0xff;

System.out.print("positive:" + positive);
System.out.print(",negative:" + negative);
System.out.print(",bytemask0:" + bytemask0);
System.out.println(",bytemask255:" + bytemask255);

// positive:120,negative:-120,bytemask0:0,bytemask255:255
System.out.println();



// 测试对象:
// -120 & 0xff
// -120 1000 1000
// & 255 1111 1111
// !! 136 1000 1000
System.out.println(negative & bytemask255);
// 测试起因:原先在书上看到竟然有这样的方法把补码表示的负数转化为该字节相对应的正数(不计符号位)

System.out.println("-------------------------------");

// 测试方向:按位运算符的影响

// 其他测试示例
// 120 & 0xff -> 120 (正常,无特殊情况)
System.out.println(1);
System.out.println(positive & bytemask255);

// -120 | 0x00 -> -120 (正常,无特殊情况)
System.out.println(2);
System.out.println(negative | bytemask0);

// 120 | 0x00 -> 120 (正常,无特殊情况)
System.out.println(3);
System.out.println(positive | bytemask0);

System.out.println("-------------------------------");

// 测试方向:数据类型
// 原来结果 转化后结果
//!!! 136 -120
System.out.println(negative & (byte)bytemask255);
// 120 120
System.out.println(positive & (byte)bytemask255);
// -120 -120
System.out.println(negative | (byte)bytemask0);
// 120 120
System.out.println(positive | (byte)bytemask0);

// 疑问:难道是int的掩码转化的结果?继续测试
System.out.println("-------------------------------");

// 测试方向:回应上个测试的疑问,强转所有位数
// -120 | 0xff -> -1
System.out.println(negative | bytemask255);
// 120 | 0xff -> 255
System.out.println(positive | bytemask255);

// 疑问:-1并无变成255?
System.out.println("-------------------------------");


// 回到第一个问题: -120 & (int)0xff 为何是 136

// -120 & 0xff
// -120 1000 1000
// & 255 1111 1111
// !! 136 1000 1000

}
}
...全文
134 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a825395336 2014-11-13
  • 打赏
  • 举报
回复
直接复制到ide运行观察较为方便
aaron_gzt 2014-11-13
  • 打赏
  • 举报
回复
在进行位运算时,如果对于结果是怎么出现的,可将参加位运算的数的二进制输出,这样子会容易明白很多。可以通过用Integer.toBinaryString(int)来输出某个数的二进制表示形式,如Integer.toBinaryString(-120)可看到-120的二进制形式、Integer.toBinaryString((byte)0xff)可看到(byte)0xff的二进制形式
aaron_gzt 2014-11-13
  • 打赏
  • 举报
回复
int是4个字节的,对于第一个问题,(int)0xff代表得是整数的255,换成二进制就是00000000 00000000 00000000 11111111,这个时候与-120(即:11111111 11111111 11111111 10001000)进行与运运算,结果就是00000000 00000000 00000000 10001000也就是136;而(byte)0xff代表的是11111111,java中运算最低是以int类型来的,所以在与运算时自动将(byte)0xff转成int类型的,也就是11111111 11111111 11111111 11111111(因为(byte)0xff未负数),所以此时与-120进行与运算的结果是-120

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧