您现在的位置:首页 --> 查看专题: byte
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
首先为什么要做这样的判断呢? 当你要strcpy活着strcmp或者hash一个字符串的时候,传统的方法是每个byte进行比较。以strcpy为例,当一个字符串比较长,我们用32(或者64位)的字长进行copy的话,一次拷贝会拷贝4个byte,能节省很多时间(忽略内存对齐等情况)。 但是,使用32位的字长进行拷贝一个难点就是判断字符串的结尾,因为字符串长度不一定是4的整数倍,每次从内存中取4个byte,我们需要判断这4个byte中是否有某个byte是0,从而判断字符串是否结束。
[ 共3篇文章 ][ 第1页/共1页 ][ 1 ]
近3天十大热文
- [159] Go Reflect 性能
- [18] 公钥私钥加密解密数字证书数字签名详解
- [16] 基于HTTP缓存轻松实现客户端应用的离线支持
- [15] Joomla反序列化漏洞的查漏补缺
- [15] osx平台上lol英雄联盟launcher启
- [14] 我的git笔记
- [14] SSL多域名绑定证书的解决方案
- [13] 在JavaScript中什么时候使用==是正
- [12] Linux内存中的Cache真的能被回收么?
- [11] 相似度计算之马氏距离
赞助商广告