java 并或非_Java的运算符--与(&)、非(~)、或(|)、异或(^)详解

public classTest1 {public static voidmain(String[] args) {/*符号为:最高位同时表示图号,0为正数,1为负数*/

/** 1、二进制转换为十进制

*

* 二进制转换为10进制的规律为:每位的值 * 2的(当前位减1次方)

* 例如: 00000001 = 0 * 2^7 + 0 * 2^6 +0 * 2^5

* + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1

* 00000010 = 0 * 2^7 + 0 * 2^6 + 0 * 2^5

* + 0 * 2^4 + 0 * 2^3 + 0 * 2^2+ 1 * 2^1 + 0 * 2^0 = 2

*

* 2、二进制的符号位:最高位表示符号位,0表示正数, 1表示负数

*

* 3、将二进制负数转换为十进制:先对该二进制数取反,然后加1,再转换为十进制,然后在前面加上负号

* 例如: 10101011 最高位为1,所以为负数。

* 第一步:取反: 0101 0100 ,

* 第二步:加1 : 0101 0101,

* 第三步:转换为10进制:85

* 第四步:加上负号: -85 。

* 所以 1010 1011 转换为十进制为 -85

*

* 4、将十进制负数转换为二进制:先得到该十进制负数的绝对值,然后转换为二进制,然后将该二进制取反,然后加1

* 例如:-85

* 第一步:得到绝对值 85

* 第二步:转换为二进制:0101 0101

* 第三步:取反: 1010 1010

* 第四步:加1: 1010 1011

* 所以,-85转换为二进制为 1010 1011*/

/** ~ ‘非‘ 运算符是将目标数的进制去反,即0变成1 ,1变成0。

* 例如: 2的二进制码为 00000010 ,它取反为11111101。

* 可见取反后结果为负数(二进制负数转换为十进制的步骤为:将二进制取反,然后+1)

* 将 1111 1101 转换为10进制

* 第一步:取反得到 0000 0010,

* 第二步:加1,得到 0000 0011 ,得到的结果为3 ,

* 第三步:在前面加上负号就可以了

* 所以结果为-3*/System.out.println(~2);/** ^ 异或,计算方式为:两个二进制数的位相同则为0 不同则为1

* 23转换为二进制为:0001 0111

* 12转换为二进制为:0000 1100

* —————————

* 计算结果为: 0001 1011 = 27*/System.out.println(23 ^ 12);/** & 按位与,计算方式为:两个二进制数的位都为1则为1 ,否则为0

* 1的二进制为:0000 0001

* 2的二进制为:0000 0010

* —————————

* 结果为 : 0000 0000 = 0*/System.out.println(1 & 2);/** | 按位或,计算方式为:两个二进制位有一个为1就为1,否者为0

* 5 的二进制为:0000 0101

* 6 的二进制为:0000 0110

* —————————

* 结果为: 0000 0111 = 7*/System.out.println(5 | 6);/** >> "有符号"右移位,

* 符号左边表示要被移位的数,右边表示需要移的位数,结果为正数则在左边补0,否则补1

* 3 的二进制为:0000 0011

* 第一步:向右移动1位:最低位右边的1被移除 000 0001

* 第二步:是正数,最高位左边补0, 0000 0001 = 1。*/System.out.println(3 >> 1);/** -3默认int型 32位

* 先转换二进制:

* 绝对值:3

* 绝对值二进制:0000 0000 0000 0000 0000 0000 0000 0011

* 取反: 1111 1111 1111 1111 1111 1111 1111 1100

* 加1: 1111 1111 1111 1111 1111 1111 1111 1101

* (-3的二进制 1111 1111 1111 1111 1111 1111 1111 1101)

* 将二进制结果右移动一位,由于是负数,所以要在最高位补1

* 1111 1111 1111 1111 1111 1111 1111 1110

* 得到的结果是负数

* 取反: 0000 0000 0000 0000 0000 0000 0000 0001

* 加1: 0000 0000 0000 0000 0000 0000 0000 0010

* 得到2,结果加上负号即为该二进制对应的十进制:-2*/System.out.println(-3 >> 1);/** >>> "无符号"右移运算符,

* 将运算符左边的对象向右移动运算符右边指定的位数。

* 采用0扩展机制,也就是说,无论值的正负,都在高位补0.

* -3默认int型 32位

* 先转换二进制:

* 绝对值:3

* 绝对值二进制:0000 0000 0000 0000 0000 0000 0000 0011

* 取反: 1111 1111 1111 1111 1111 1111 1111 1100

* 加1: 1111 1111 1111 1111 1111 1111 1111 1101

* 将二进制结果右移一位,因为无符号所以。最高位补0

* 0111 1111 1111 1111 1111 1111 1111 1110

* 结果为:2147483646*/System.out.println(-3 >>> 1);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值