byte转char,为什么要& 0xff

code-artist 2008-09-03 11:17:06
我看一个有名的开源组件,用到byte--->char代码是这样的:
c[i] = (char) (b[i] & 0xff) (b[i]为byte型,c[i]为char型)
觉得与一下0xff没什么用。直接c[i] = (char)b[i]有何异?
...全文
6972 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
追求执着 2012-07-03
  • 打赏
  • 举报
回复

nice
刚刚看到这个,学习了!!!
hongnan006 2012-06-27
  • 打赏
  • 举报
回复
学习了,谢谢各位
陈志凯 2012-06-11
  • 打赏
  • 举报
回复
学习了
I_buntu 2012-01-16
  • 打赏
  • 举报
回复
学习了
btloveet 2011-10-13
  • 打赏
  • 举报
回复
学习了!
jackingod 2011-07-19
  • 打赏
  • 举报
回复
Mark~源码的学习看样子是必须的啦
getter 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 WhatX 的帖子:]
我看一个有名的开源组件,用到byte--->char代码是这样的:
c[i] = (char) (b[i] & 0xff) (b[i]为byte型,c[i]为char型)
觉得与一下0xff没什么用。直接c[i] = (char)b[i]有何异?
[/Quote]
這個是unsigned shifting用的辦法..
java中的數值是int,所以0xFF是int,而byte是有符號數,int亦然,直接由byte升為int,符號自動擴展,而進行了& 0xFF後,就把符號問題忽略掉了,將byte以純0/1地引用其內容,所以要0xFF,不是多餘的,你用一些Stream讀取文件的byte就知道了,我昨天搞了一天,就不明白為什麼讀出來的數某些byte會在移位後錯誤的,就是因為這個原因.
getter 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 WhatX 的帖子:]
我看一个有名的开源组件,用到byte--->char代码是这样的:
c[i] = (char) (b[i] & 0xff) (b[i]为byte型,c[i]为char型)
觉得与一下0xff没什么用。直接c[i] = (char)b[i]有何异?
[/Quote]
這個是unsigned shifting用的辦法..
java中的數值是int,所以0xFF是int,而byte是有符號數,int亦然,直接由byte升為int,符號自動擴展,而進行了& 0xFF後,就把符號問題忽略掉了,將byte以純0/1地引用其內容,所以要0xFF,不是多餘的,你用一些Stream讀取文件的byte就知道了,我昨天搞了一天,就不明白為什麼讀出來的數某些byte會在移位後錯誤的,就是因為這個原因.
ChDw 2008-09-03
  • 打赏
  • 举报
回复
char c = (char)-1 & 0xFF;
char d = (char)-1;
System.out.println((int)c);
System.out.println((int)d);



这样输出是

255
65535


上面代码就是为了避免错误
  • 打赏
  • 举报
回复
与 0xff 做 & 运算会将 byte 值变成 int 类型的值,也将 -128~0 间的负值都转成正值了。
cydp007 2008-09-03
  • 打赏
  • 举报
回复
0xFF is hexidecimal, you can Wikipedia that part. 

FF is a representation of

00000000 00000000 00000000 11111111

(a 32-bit integer)

& means bit-wise "and", and so when you use it on two ints, each pair of bits from those two ints is and-ed and the result is placed in the resultant int:

Example (showing 16 bits only)

0101 1100 1010 1100
&0000 0000 1111 1111
-----------------
=0000 0000 1010 1100



So as you can see, 0xFF is often used to to isolate a byte in an integer, by truncating the integer to one byte's worth of 1's.

For more information, see this WP article:
zhanggc1001 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ChDw 的回复:]
因为byte的取值范围是 -128~127,而Char是0~65535

所以需要& 0xFF 使得byte原来的负值变成正的
[/Quote]
学习了
justinavril 2008-09-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ChDw 的回复:]
因为byte的取值范围是 -128~127,而Char是0~65535

所以需要& 0xFF 使得byte原来的负值变成正的
[/Quote]
But it changes the byte value, doesn't it?
ChDw 2008-09-03
  • 打赏
  • 举报
回复
因为byte的取值范围是 -128~127,而Char是0~65535

所以需要& 0xFF 使得byte原来的负值变成正的
justinavril 2008-09-03
  • 打赏
  • 举报
回复
I don't know the difference...Maybe they are the same...
ZangXT 2008-09-03
  • 打赏
  • 举报
回复
避免java隐含的符号扩展吧
iwillrockyou 2008-09-03
  • 打赏
  • 举报
回复
学习了

aniude 2008-09-03
  • 打赏
  • 举报
回复
1) 位运算不限制为int, long也行的。
2)
3) 负数进行&操作时需要转成补码,-2 的补码是0xFFFFFFFE
code-artist 2008-09-03
  • 打赏
  • 举报
回复
补充一下:
1)。位运算符只针对4byte的int型
2)。-2的byte类型 16进制表示为 FE(2取反加1)
3)。-2 & 0xFF运算: 实际-2带符合bit-wise成int,即FE会变成FFFFFFFE(2取反加1), 接着
0xFFFFFFFE & 0x000000FF = 0x 000000FE; 如果不&,就是FFFFFFFE。
cuilupeng999 2008-09-03
  • 打赏
  • 举报
回复
学习了
加载更多回复(1)
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2008-09-03 11:17
社区公告
暂无公告