java - 将字节转换为整数 - 为什么和每个字节都用0xff?

时间:2016-05-01 13:17:10

标签: java math byte bit

有什么区别:

int n = (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff

int n = b1 << 24 | b2 << 16 | b3 << 8 | b4

?我们为什么要AND每个字节255

2 个答案:

答案 0 :(得分:2)

首先,您需要了解b1 <<< 24期望a操作数的类型为intlong。因此,如果b1byte,则Java会在转换发生之前将其转换为int

通过将每个byte值映射到相应的int值来实现转换。问题是byte签名的类型,这意味着可能的值为-128+127。因此,当您使用负值转换byte时,您将得到一个负值int;例如11111111字节-1(二进制)变为11111111111111111111111111111111(二进制),也是-1

那些前导符号是符号扩展的结果,如果我们要将它们移位并以按位方式组合它们,我们不希望它们。

因此,您经常会看到一个字节被0xff屏蔽,以便在转换后删除符号扩展的(不需要的)结果。例如

    11111111111111111111111111101110  &
    00000000000000000000000011111111

给出

    00000000000000000000000011101110

答案 1 :(得分:1)

我假设#!/usr/local/bin python3 #-*- coding: utf-8 -*- main_string = input() sub_string = input() count = counter = 0 for i in range(len(main_string)): if main_string[i] == sub_string[0]: k = i + 1 for j in range(1, len(sub_string)): if k != len(main_string) and main_string[k] == sub_string[j]: count += 1 k += 1 if count == (len(sub_string) - 1): counter += 1 count = 0 print(counter) b1b2b3的类型为b4

在这种情况下,它们的值将被符号扩展,如果它们是负数,如果不使用AND,结果将是错误的。

演示:

byte

Output

class Test {
    public static void main(String[] args) {
        byte a = (byte)128;
        int x1 = a << 8;
        int x2 = (a & 0xff) << 8;
        System.out.println(x1);
        System.out.println(x2);
    }
}