孙钰佳的博客

转载本BLOG的原创文章请注明作者和出处,谢谢 !

孙钰佳ID:sunyujia
25735次访问,排名4412好友144人,关注者175
sunyujia的文章
原创 70 篇
翻译 0 篇
转载 18 篇
评论 49 篇
孙钰佳的公告
声明:转载本BLOG的原创文章请注明作者和出处,谢谢!
欢迎使用站内搜索:
最近评论
jz1979:我一模一样的写了一个,为什么点链接一点反应都没有?
xingxing:onsort=getValue
这个onsort是怎么来的 有啥作用?
davide520:兄弟,可以支持修改操作不咯.交流一下.
yiyi_wx:第一次看到的时候就觉得很震撼~~当时就想用“很好很强大”来形容,里面很多组件的使用都很便捷。吼吼~
miao:不喜欢
配置很繁琐
感觉像一个很强大的 javascript
文章分类
收藏
    相册
    参考手册
    51chm
    CSS手册
    DHTML手册
    HTML手册
    J2SE API
    JScript手册
    MSDN
    SQL手册
    满江红RedSaga
    技术社区
    BEA dev2dev(RSS)
    Blueidea(RSS)
    IBM developerWorks(RSS)
    Javaeye(RSS)
    Matrix(RSS)
    Sun Java Forum (RSS)
    友情链接
    Java世纪网
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java中byte转换int时与0xff进行与运算的原因收藏

    新一篇: 使用Ant在Weblogic部署的官方文档 | 旧一篇: JNI 数据类型转换

    java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码
     public static String bytes2HexString(byte[] b) {
      String ret = "";
      for (int i = 0; i < b.length; i++) {
       String hex = Integer.toHexString(b[i] & 0xFF);
       if (hex.length() == 1) {
        hex = '0' + hex;
       }
       ret += hex.toUpperCase();
      }
      return ret;
     }
    上面是将byte[]转化十六进制的字符串,注意这里b[i] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
    b[i] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.

    其原因在于:
    1.byte的大小为8bits而int的大小为32bits
    2.java的二进制采用的是补码形式

    在这里先温习下计算机基础理论

    byte是一个字节保存的,有8个位,即8个0、1。
    8位的第一个位是符号位,
    也就是说0000 0001代表的是数字1
    1000 0000代表的就是-1
    所以正数最大位0111 1111,也就是数字127
    负数最大为1111 1111,也就是数字-128

    上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

    1、反码:
            一个数如果是正,则它的反码与原码相同;
            一个数如果是负,则符号位为1,其余各位是对原码取反;

    2、补码:利用溢出,我们可以将减法变成加法
           对于十进制数,从9得到5可用减法:
           9-4=5    因为4+6=10,我们可以将6作为4的补数
           改写为加法:
           9+6=15(去掉高位1,也就是减10)得到5.

           对于十六进制数,从c到5可用减法:
           c-7=5    因为7+9=16 将9作为7的补数
           改写为加法:
           c+9=15(去掉高位1,也就是减16)得到5.

        在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

        ⑴一个数为正,则它的原码、反码、补码相同
        ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
        
     - 1的原码为                10000001
     - 1的反码为                11111110
                                                       + 1
     - 1的补码为                11111111
     
     0的原码为                 00000000
     0的反码为                 11111111(正零和负零的反码相同)
                                              +1
     0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

    Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
    例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
    和0xff相与后,高24比特就会被清0了,结果就对了。

    发表于 @ 2008年05月04日 20:01:00|评论(loading...)|收藏

    新一篇: 使用Ant在Weblogic部署的官方文档 | 旧一篇: JNI 数据类型转换

    评论

    #wbchn 发表于2008-05-05 09:31:38  IP: 123.127.10.*
    精彩
    2008-05-22 23:28:18作者回复
    谢谢,谢谢。
    #ziyuetian 发表于2008-05-20 17:31:03  IP: 122.4.33.*
    恩,有学到点东西,谢谢楼主
    2008-05-22 23:25:11作者回复
    客气了
    #avery_leo 发表于2008-05-23 17:35:52  IP: 219.239.243.*
    不错
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 孙钰佳