栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java中的byte数据符号位和移位问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java中的byte数据符号位和移位问题

byte是有符号的,我们看下如下操作。

byte data = -10

二进制补码(负数取反加1):11110110

运算1:

int dat2 = (int)((data & 0xff) << 1)

&运算结果会先变为字节,此时运算数据为纯字节,不存在符号位只是字节流,左移1位以后,为111101100,转为int后由于不存在符号位,故转int后为492。

运算2:

int dat1 = (int)(data << 1);

左移1位以后,为111101100,此时最后一位为符号位,保持符号位不变减一后取反为100010100,转int后为-20。

故做移位运算时,必须要先做运算 data & 0xff 再做移位,否则会有可能被判断为负数,移位运算时会认为是负数,导致结果不对。下面给出整数和byte数组的转换方法:

public byte[] longToBytes(long values) {
    byte[] buffer = new byte[8];
    for (int i = 0; i < 8; i++) {
        int offset = LONG_BYTES - (i + 1) * 8;
        buffer[i] = (byte) ((values >> offset) & 0xff);
    }
    return buffer;
}
//byte数组转long,从index开始,先转高位后转低位。
public long longFromBytes(byte[] input, int index) {
    if ((index + 8) > input.length) {
        return 0;
    }
    long value = 0;
    for (int i = 0; i < 8; ++i) {
        int offset = LONG_BYTES - (i + 1) * 8;
        value = value | (((long) (input[index + i] & 0xff)) << offset);
    }
    return value;
}
public byte[] intToBytes(int values) {
    byte[] buffer = new byte[4];
    for (int i = 0; i < 4; i++) {
        int offset = INT_BYTES - (i + 1) * 8;
        buffer[i] = (byte) ((values >> offset) & 0xff);
    }
    return buffer;
}
public int intFromBytes(byte[] input, int index) {
    if ((index + 4) > input.length) {
        return 0;
    }
    int value = 0;
    for (int i = 0; i < 4; ++i) {
        int offset = INT_BYTES - (i + 1) * 8;
        value = value | (((int) (input[index + i] & 0xff)) << offset);
    }
    return value;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276323.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号