关于 java 位移 、与 的疑惑

s是一个字符串 ,现在 将s中的字符位移,然后写入到 OutputStream 中

[code="java"]
public final void writeChars(String s, OutputStream out) {
int len = s.length();
for (int i = 0; i < len; i++) {
int v = s.charAt(i);

out.write((v >>> 0) & 0xFF);(1)
out.write((v >>> 8) & 0xFF);(2)

}
}
[/code]

请问(1)(2) 是什么意思的?

另外(1)中 ,字符根本就没有动,有何意义?

[b][color=blue](1)(2)是分别写入一个char的低8位数字、高8位数字。

解释如下:

Java中的Character是16位的Unicode。

假设1个char的编码为 YYYYYYYY(高8位) XXXXXXXX(低8位)

(v >>> 0) & 0xFF

v>>>0 无符号左移0为 得到: YYYYYYYY XXXXXXXX

再和 0xFF相与:

00000000 00000000 YYYYYYYY XXXXXXXX
相与
00000000 00000000 00000000 11111111

得到
00000000 00000000 00000000 XXXXXXXX

out.write((v >>> 0) & 0xFF);(1)

写入的就是 整数 00000000 00000000 00000000 XXXXXXXX( char的低8位)

同理 out.write((v >>> 8) & 0xFF);(2)

v>>>8 无符号左移8为 得到: 00000000 YYYYYYYY

再和 0xFF相与:

00000000 00000000 00000000 YYYYYYYY
相与
00000000 00000000 00000000 11111111

得到:
00000000 00000000 00000000 YYYYYYYY

写入的就是 整数 00000000 00000000 00000000 YYYYYYYY ( char的高8位)

这样就把一个Character的数据,以2进制bit流的形式写入到 硬盘中了。
[/color][/b]

[b]
PS:

关于先写入低8位、后写入高8位,这是 小端(little-endian)存储法(Windows就是这样的)。

IBM Sun的机器一般采用大端。[/b]

呵呵 不好意思 , 笔误 更正一下