请教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中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位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)