位运算

本文深入解析位运算的基础概念,包括位移操作、补码表示、位运算符使用及计算过程,并通过实例演示如何将byte数组转换为int类型,反之亦然。此外,还介绍了几种常见的位操作技巧,如判断是否为2的倍数、消除二进制最后一个1等。

一、位运算基础


1、位运算是针对整数的二进制进行的位移操作
2、整数 32位 , 正数符号为0,负数符号为1。十进制转二进制 不足32位的,最高位补符号位,其余补零
3、在Java中,整数的二进制是以补码的形式存在的
4、位运算计算完,还是补码的形式,要转成原码,再得出十进制值
5、正数:原码=反码=补码 负数:反码=原码忽略符号位取反, 补码=反码+1

例如:十进制4 转二进制在计算机中表示为(补码) 00000000 00000000 00000000 00000100

例如:十进制-4 转二进制在计算机中表示为(补码) 11111111 11111111 11111111 11111100

负数转二进制过程(以-4为例)

原码:10000000 00000000 00000000 00000100(转二进制,最高位为符号位)  
反码:11111111 11111111 11111111 11111011(符号位不变,其余取反)  
补码:11111111 11111111 11111111 11111100(反码+1)


-4 << 1 计算过程

-4 补码  11111111 11111111 11111111 11111100  
左移一位 11111111 11111111 11111111 11111000 (这时候还是补码)
# 如果最高位符号位为0,就不需要继续操作了,因为正数的补码=原码,如果最高位是1,继续往下走
转成反码 11111111 11111111 11111111 11110111 (补码-1)  
转成原码 10000000 00000000 00000000 00001000 (忽略符号位取反)  
转十进制 -8  


左移( << ) 整体左移,右边空出位补零,左边位舍弃 (-4 << 1 = -8)
右移( >> ) 整体右移,左边空出位补零或补1(负数补1,整数补0),右边位舍弃 (-4 >> 1 = -2)
无符号右移( >>> )同>>,但不管正数还是负数都左边位都补0 (-4 >>> 1 = 2147483646)
与( & )每一位进行比较,两位都为1,结果为1,否则为0(-4 & 1 = 0)
或( | )每一位进行比较,两位有一位是1,结果就是1(-4 | 1 = -3)
非( ~ ) 每一位进行比较,按位取反(符号位也要取反)(~ -4 = 3)
异或( ^ )每一位进行比较,相同为0,不同为1(^ -4 = -3)

二、运用

byte数组转int、int转length长度的byte数组(跟前面正好相反)

byte是8位,int是32位
如果byte数组长度4 ,基本思路:byte[0]左移24,byte[1]左移16,byte[2]左移8,
如果byte数组小于4 byte[n] 左移 (4-n-1)*8(同样适用长度4的)公式
byte[] b={0,0,1,0};

A=0 B=0 C=256 D=0

int值   =A+B+C+D =256

 

public static int bytes2Int(byte[] b, int start, int len) {
        int sum = 0;
        int end = start + len;
        for (int i = start; i < end; i++) {
            int n = b[i] & 0xff;
            n <<= (--len) * 8;
            sum += n;
        }
        return sum;
    }

    //int按长度转byte
    public static byte[] int2Bytes(int value, int length) {
        byte[] b = new byte[length];
        for (int k = 0; k < length; k++) {
            b[length - k - 1] = (byte) ((value >> 8 * k) & 0xff);
        }
        return b;
    }

 

三、可能会用到的位操作,也可以用来装装拉

  • 判断是不是2的倍数
(n & 1)==0
  • 判断是否包含
a&b==b
7&3==3
  • 消除二进制最后一个1
n & (n - 1)
  • 加一
int n = 1;
n = -~n;
  • 减一
int n = 2;
n = ~-n;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值