为了账号安全,请及时绑定邮箱和手机立即绑定

以下案例为什么要将i右移后从高位开始写入呢?不是每次从低位开始写入吗?

以下案例为什么要将i右移后从高位开始写入呢?不是每次从低位开始写入吗?

int i = 0x7fffffff;

//用write方法每次只能写一个字节,如果要把i写进去就得写4次

raf.write(i >>> 24);//高8位

raf.write(i >>> 16);

raf.write(i >>> 8);

raf.write(i);


正在回答

2 回答

java默认的编码方式是unicode big endian,即大端存储方式的unicode,具体数据的高位字节存放在低位地址上。关于大端模式和小端模式可以进一步百度。

0 回复 有任何疑惑可以回复我~
#1

天涯蝶舞 提问者

raf.write('A');//只写了一个字节 System.out.println(raf.getFilePointer()); raf.write('B'); A的二进制:00000000 01000001 B的二进制:00000000 01000010 这里为什么没有对A和B进行右移操作呢?每次写只能写一个字节,按照大端存储方式那就全为0了吧?而且右移操作符应该是2个>>吧,怎么他这里有3个呢?请教!
2016-01-07 回复 有任何疑惑可以回复我~
#2

chrt 回复 天涯蝶舞 提问者

,因为这只是演示,char型占两个字节,对'A'来说高八位没意义,只存入低八位再取出还是可以解析成'A'。假如你要存入汉字比如说"中",就要通过移位把高八位和低八位都存入,这样再读取出来才能解析成"中"。>>>三个表示无符号右移
2016-01-07 回复 有任何疑惑可以回复我~
#3

天涯蝶舞 提问者

非常感谢!
2016-01-07 回复 有任何疑惑可以回复我~
#4

bryan4it

如果默认的是大端存储,那write()应该写入的是"A"的高8位啊???
2016-01-28 回复 有任何疑惑可以回复我~
查看1条回复

raf.write('A');//只写了一个字节

System.out.println(raf.getFilePointer());

raf.write('B');


A的二进制:00000000 01000001

B的二进制:00000000 01000010


这里为什么没有对A和B进行右移操作呢?每次写只能写一个字节,按照大端存储方式那就全为0了吧?而且右移操作符应该是2个>>吧,怎么他这里有3个呢?请教!


0 回复 有任何疑惑可以回复我~
#1

Darkchaox

A:00000000 01000001前8bit没有数据,所以只需保存后面01000001这8bit; 操作符参考: 移位运算符也针对二进制的“位”,它主要包括:左移位运算符(<<)、右移位运算符(>>>)、带符号的右移位运算符(>>)。其中: 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。 右移运算符用符号“>>>”表示,是将运算符左边的对象向右移动运算符右边指定的位数,并且在高位补 0。 带符号的右移运算符用符号“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补 1。
2016-03-12 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

以下案例为什么要将i右移后从高位开始写入呢?不是每次从低位开始写入吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信