有什么区别:
int n = (b1 & 0xff) << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | b4 & 0xff
和
int n = b1 << 24 | b2 << 16 | b3 << 8 | b4
?我们为什么要AND
每个字节255
?
答案 0 :(得分:2)
首先,您需要了解b1 <<< 24
期望a
操作数的类型为int
或long
。因此,如果b1
是byte
,则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)
,b1
,b2
和b3
的类型为b4
。
在这种情况下,它们的值将被符号扩展,如果它们是负数,如果不使用AND,结果将是错误的。
演示:
byte
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);
}
}