首先,做百度的说明
是二进制的“与”运算,以位为单位运算参与运算的两个个数的二进制数。 运算法则如下。
0=0
0=0
1=0
1=1
参加运算的数量换算成二进制进行运算。 例如,7 2的结果是2。 步骤如下。
7 2
=0111 0010
=0010
=2
也就是说,在比特数和运算中,只有在两个变量都为1时,结果才为1,11==1,10==01==00==0
然后,具体说一下自己在相遇时的应用。 在值得获取文件MD5的时候,使用位运算处理数据,在使用BigInteger获取digest.update的byte[]的时候,在顶部为0的时候删除。
之后,变换16进制数之间的变换后,解决这个问题。 途中遇到了代码使用的代码。
digest.update(buffer,0,len ); 方法
代码片段
stringbuilder result=new stringbuilder (;
byte[] b=digest.digest (;
for(intI=0; i b.length; I ) {
result.append(integer.tostring () b[I]0xff )0x 100,16 ).substring(1) )1);
}
return result.toString (;
integer.tostring () b[I]0xff )0x 100,16 ).substring(1) 1;
说明: b[i]为byte,0x用十六进制表示。
0xff的十进制数为15 * 1615=255,0x 100的十进制数为1*16*16=256
integer.tostring(num,16 ); 以16进制、substring(1)、开始位1、结束为最后切出字符串。
也就是说,在变换为二进制后,变换为十六进制,进行剪切。
byte[i]0xff的and运算,即十六进制计算
我认为0xff的目的是把原来的负数变成正数
如果与byte[i]0xff进行运算,计算16进制数得到的byte[i]为负数,
计算机存储数据的结构:存储在正数中的二进制源代码。 负数中存储的是二进制补码。
其中,补数是负数绝对值的反码加1。 绝对值,反转,加1。
在byte -- int是byte字节即8比特二进制、int的4字节即32比特二进制的情况下,byte -- int从8比特向32比特,上位24比特全部补充1
这样,前24名全部是1。 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
0xFF的二进制表示形式为1111 1111。 转换为int计算时,前24位为0:000000000000001111
的运算规则只有11=1
1111111111111111111111111111111111111111111111111 * * * *
0000 0000 0000 0000 0000 0000 1111 1111
=
0000000000000000000000 # # #
这样,在byte[i] 0Xff之后,可以将前24位设为0,称为正数。
所以需要0xFF使byte的原始负值为正