java 二进制运算

最近对基于二进制的运算符是深有感受啊

一、二进制的概念

基于计算机内部组成原理,在内存中字节是可寻址的最小单位,每个1字节由8个0或1的二进制位组成(有时二进制位也称为比特,英文bit),最左边的二进制位称为最高位,最右边的二进制位称为最低位。如下图。
在这里插入图片描述

 二进制表示数据的范围 

a、无符号:0000 0000 -> 1111 1111; 对应的是0 - 256

b、有符号
有符号数是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-” ;其余数位用作数值位,代表数值。

 例如有符号的 0101 0101 该如何计算,最左边0表示+,那余下还有7为,计算时从右到左依次来

有符号的正数为85,那负数为-85,所以有符号二进制为 -85 到 +85

二、十进制转换二进制

10进制的125转成二进制就是 1111101 ,在计算机里补齐就是 0111 1101

 

三、二进制的实际应用

1、判断奇偶数

我之前也是摩2看余数的,现在有效率更高的做法,使用按位与效果更高,看结果是否为1即可判断是否为奇数。

 

2、通过『按位异或』运算,可以实现两个值的交换,而不必使用临时变量。

    a=10100001,  b=00000110

    a=a^b;   //a=10100111

    b=b^a;   //b=10100001

    a=a^b;   //a=00000110 

3、互换二进制奇偶位,实现的功能是将一个int型的数的奇偶位互换,例如6的2进制为0110,(从右向左)第一位与第二位互换,第三位与第四位互换,其余都是0不需要交换,得到1001,输出应该为9

public static void main(String[] args) {
        int n = 6;
        int end = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);

// 测试代码
        System.out.println("6 的二进制 " + Integer.toBinaryString(6));
        System.out.println("6 的偶数 " + Integer.toBinaryString(6 & 0xAAAA) +
                ";6 的偶数位右移动 " + Integer.toBinaryString((6&0xAAAA) >> 1));
        System.out.println("6 的奇数 " + Integer.toBinaryString(6&0x5555) +
                "; 6 的奇数左移动 " + Integer.toBinaryString((6&0x5555) << 1));
        
}

运行示例

 分析:

  • 问:示例中为什么要按位与 十六进制数啊?

    0xAAAA=1010 1010 1010 1010(奇数都为1)0x5555= 0101 0101 0101 0101(偶数都为1)

      通过按位与&,分别获得二进制110 偶位数 10,奇位数100

  • 问:为啥要对提取后的二进制左位移?                   

    答:你不移动位置怎么调换位置啊
  • 问:为什么二进制的偶数是右移而左移动啊?

    答:从第一小节(1、判断奇偶数)可见,偶数的二进制末尾是0,奇数的二进制末尾为1,所以偶数往右边移动不会丢数据,二奇数往右边移动肯定会丢数据的
  • 问:6的二进制就三位,为啥左移动后变四位了,这样会不会偏离了?     

    答:一个byte最小单位是8个位对吧(见第一章二进制概念),按低位对齐,高位补全来将,6的二进制是 0000 0110,只是高位的0是无意义可以省略,所以偶数为10 >> 1 = 0001,100 << 1 = 1000,0001 | 1000 = 1001 = 9

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值