请教java位运算问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教java位运算问题?相关的知识,希望对你有一定的参考价值。

public static byte[] numberToLe(byte[] target, Number number, int offset, int len)
long src = number.longValue();

for(int i = 0; i < len; ++i)
target[offset + i] = (byte)((int)(src >> i * 8 & 255L));


return target;


请问 (byte)((int)(src >> i * 8 & 255L)); 这段代码是什么意思, 255L代表什么。
谢谢

Java 位运算 Java 位运算[转]一,Java 位运算1.表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (l)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。2.位运算符 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、>)。1)左移位运算符()则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。3)Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。 参考技术A

">>"这个符号表示向右位移。java中int类型占4字节也就是32位,所以2在java中的2进制表示就是

0000,0000,0000,0000,0000,0000,0000,0010

每个字节向右位移1位,最左边原来是什么,就添上什么,所以结果就是

0000,0000,0000,0000,0000,0000,0000,0001

这个转为10进制就是1


“&”表示与,只有两个数同位置的数都为1,那么结果才为1,其他情况都为0。如有两个数,3,5,二进制表示为

0000,0000,0000,0000,0000,0000,0000,0011

0000,0000,0000,0000,0000,0000,0000,0101

那么这3&5结果为

0000,0000,0000,0000,0000,0000,0000,0001

转为10进制就是1


“L”表示这是一个long类型的数,如果不加后缀,默认表示一个int类型的数,如果这个数超出了int类型的范围,就会报错。如:

long l=11111111111;

这样不能通过编译,

long l=11111111111L;

加个L后就可以。


(int)表示强转类型,long类型8字节,64位。比:1080863910568919041L,这个数的二进制是:

0000,1111,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0001

(int)之后,从低到高截取32位,结果就是

0000,0000,0000,0000,0000,0000,0000,0001

结果为1


(byte)跟(int)类似,只是截取前8位。


&255L的作用是把最低8位截取出来,

(byte)((int)(src >> i * 8 & 255L));中“*”的优先级比“>>”高。

这段代码就是想把一个数字转为byte数组

比如

0000,1000,1000,0000,1000,1000,1000

255L的二进制有效位是

1111,1111

与上面那个数进行&操作结果就是

1000,1000

每次多右移8位,就是把想要获取的那8位移到最低位,再通过&255L截取出来,再转为byte类型。

jdk源码中java.util.HashMap#tableSizeFor这个方法用了类似的思路,只是目的不同。

没检查过,有错再说。

本回答被提问者采纳

以上是关于请教java位运算问题?的主要内容,如果未能解决你的问题,请参考以下文章

Java千问:Java位运算经典应用

Java基础-位运算

JAVA-初步认识-第三章-位运算符

Java中的位运算符

Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)

Java位运算基础知识