java的异或运算_java与或非异或运算符(&| ^ ~ >> << >>>)

public static voidmain(String[] args) {/*** & 与运算

* 1, 二进制都为1才为1;

**/

/*System.out.println(5 & 3); // 101 & 11 = 1 --> 1

System.out.println(5 & 3); // 11 & 101 = 1 --> 1

System.out.println(-5 & 4); // 11111011 & 100 = 0 --> 0

System.out.println(-10 & 5); // 11110110 & 101 = 100 --> 4*/

/*** | 或运算

* 1, 如果相对应位都为0,则结果为0,否则为1

* 2, 只取8位进行计算, 不是32位*/

/*System.out.println(5 | 3); // 101 | 11 = 111 --> 7

System.out.println(3 | 5); // 11 | 101 = 111 --> 7

System.out.println(-5 | 3); // 11111011 | 11 = 11111111 --> -3

System.out.println(5 | -3); // 101 | 11111101 = 11111101 --> -5*/

/*** ~ 非运算, 按位取反

* 1,重点

* 2, 流程: 原码 --》 反码 --》 补码 --》补码 --》反码 --》 原码

* 2,取八位计算,int(32位):

* 比如 :5 的二进制 补码是: 00000101

* 取反补码是: 11111010

* 补码转反码-1: 11111001

* 反码转原码(最高位为1,负数):10000110

* 结果: -6

*

* 如果是负数:-5

* -5的补码: 11111011

* -5取反补码: 00000100

* 现在补码是正数: 即结果为:4*/

/*System.out.println("----非运算 ~ -----");

System.out.println(~5);

System.out.println(~-5);*/

/*** ^ 异或运算

* 1, 相对应位相同,则结果为0,否则为1:

* 例如:110 ^ 110 = 000 --> 0

* 2, 负数运算:-6 ^ 5:(取八位计算)

* -6补码:11111010

* 5补码: 00000101

* -6^5补码: 11111111

* 结果反码:11111110

* 原码: 10000001

* 结果:-1*/

/*System.out.println("----异或运算 ^ -----");

System.out.println(6^6); // 110 ^ 110 = 000 ---> 0

System.out.println(6^5); // 110 ^ 101 = 011 --> 3

System.out.println(-6^5); //*/

/*** >> 右移

* 右端被移除,左端移入原来最高位,现在最高位是1

* 例子:-5 >> 1:

* -5补码:11111011

* 右移1位:11111101 :右端被移除,左端移入原来最高位,现在最高位是1

* 反码: 11111100:减去1

* 原码: 10000011:

* 结果: -3*/

/*System.out.println("----右移 >> -----");

System.out.println((4>>2)); // 100 >> 2 = 1 --> 1

System.out.println(8>>2); // 1000 >> 2 = 10 --> 2

System.out.println(4>>1); // 100 >> 1 = 10 -->2

System.out.println(8>>1); // 1000 >> 1 = 100 -->4

System.out.println(-5>>1); //*/

/*** << 左移

* 最高位溢出,最低为补0

**/

/*System.out.println(4<<2); // 100 << 2 = 10000 --> 16;

System.out.println(10<<2); // 1010 << 2 = 101000 --> 40*/

/*** >>> 无符号右移

* 最低位移除,最高位补零,与 ‘>>’ 最高位移入最高位不同

* 例子:-10>>>2

* -10补码: 11111111 11111111 11111111 11110110

* 右移两位: 00111111 11111111 11111111 11111101

* 结果: 1073741821*/

/*System.out.println(10>>>1); // 1010 >>> 1 = 0101 --> 5

System.out.println(10>>>2); // 1010 >>> 2 = 0010 ---> 2

System.out.println(2>>>3); // 0010 >>> 3 = 0000 ----> 0

System.out.println(-10>>>2); //*/}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值