Java中移位运算以及int、long和byte的转化

移位运算符

运算符含义
<<左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
>>"有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1.
>>>"无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0.

举例:

将int转化为byte存在byte[]数组中:

    public static void setIntAt(byte[] buffer, int offset, int value) {
        buffer[offset + 0] = (byte)((value >> 24) & 0xff);
        buffer[offset + 1] = (byte)((value >> 16) & 0xff);
        buffer[offset + 2] = (byte)((value >> 8) & 0xff);
        buffer[offset + 3] = (byte)((value) & 0xff);
    }

同理将long转化为byte存在byte[]数组中:

    public static void setLongAt(byte[] buffer, int offset, long value) {
        buffer[offset + 0] = (byte) ((value >> 56) & 0xFF);
        buffer[offset + 1] = (byte) ((value >> 48) & 0xFF);
        buffer[offset + 2] = (byte) ((value >> 40) & 0xFF);
        buffer[offset + 3] = (byte) ((value >> 32) & 0xFF);
        buffer[offset + 4] = (byte) ((value >> 24) & 0xFF);
        buffer[offset + 5] = (byte) ((value >> 16) & 0xFF);
        buffer[offset + 6] = (byte) ((value >> 8) & 0xFF);
        buffer[offset + 7] = (byte) (value & 0xFF);
    }

相反,将byte[]数组转int:

public static int getIntAt(byte[] buffer, int offset) {
        int value = 0;
        value |= (buffer[offset + 0] & 0xFF) << 24
                | (buffer[offset + 1] & 0xFF) << 16
                | (buffer[offset + 2] & 0xFF) << 8
                | (buffer[offset + 3] & 0xFF);
        return value;
    }

同理将byte[]数组转long

    public static long getLongAt(byte[] buffer, int offset) {
        long value = 0;
        value |= (long)(buffer[offset + 0] & 0xFF) << 56
                | (long)(buffer[offset + 1] & 0xFF) << 48
                | (long)(buffer[offset + 2] & 0xFF) << 40
                | (long)(buffer[offset + 3] & 0xFF) << 32
                | (long)(buffer[offset + 4] & 0xFF) << 24
                | (long)(buffer[offset + 5] & 0xFF) << 16
                | (long)(buffer[offset + 6] & 0xFF) << 8
                | (long)(buffer[offset + 7] & 0xFF);
        return value;
    }

将byte[]数组以十六进制输出:

    public static String toHex(byte[] buffer) {
        StringBuffer result = new StringBuffer();

        for (int i = 0; i < buffer.length; i++) {
            byte bv = buffer[i];
            result.append(i == 0 ? "" : ' ')
                    .append(hex.charAt((bv >> 4) & 0x0F))
                    .append(hex.charAt(bv & 0x0F));
        }

        return result.toString();
    }

Demo:

public static void main(String[] args) {
		byte[] buffer = new byte[16];

		ByteAndStringUtil.setIntAt(buffer, 0, 27);
		ByteAndStringUtil.setLongAt(buffer, 4, -11584858);
		ByteAndStringUtil.setIntAt(buffer, 12, -20);
		for (int index = 0; index < buffer.length; index ++) {
			System.out.print(buffer[index] + "!");
		}

		System.out.println();

		System.out.println(ByteAndStringUtil.toHex(buffer));

		int fileId = ByteAndStringUtil.getIntAt(buffer, 0);
		long offset = ByteAndStringUtil.getLongAt(buffer, 4);
		int length = ByteAndStringUtil.getIntAt(buffer, 12);

		System.out.println(fileId + ", " + offset
				+ ", " + length);


	}
0!0!0!27!-1!-1!-1!-1!-1!79!58!-90!-1!-1!-1!-20!
00 00 00 1B FF FF FF FF FF 4F 3A A6 FF FF FF EC
27, -11584858, -20

对,很对!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值