有个按位取反算法,我看不懂,想请教各位一下private byte[] change(byte[] buff){
for(int i=0;i<=buff.length;i++){
  int b=0;
  for(int j=0;j<8;j++){
    int bit=(buff[i]>>j&1)=0?1:0;
    b+=(1<<j)*bit;
   }
  buff[i]=(byte)b;}
return buff;}下面这2句是什么意思呀?   int bit=(buff[i]>>j&1)=0?1:0;
    b+=(1<<j)*bit;不是有一个按位取反的符号吗?(~)直接~buff
不就行了吗?干嘛搞那么复杂啊?不解了,向各位请教!

解决方案 »

  1.   

    的确只要~就可以了
    这个算法在JAVA里面是多此一举
    目前我还看不出来它有什么优点
      

  2.   

    看着应该是用来处理 负数情况的
    byte是带符号的
      

  3.   

    我看明白了,但是这样似乎是多此一举了,应为这个算法是用来加密一个 密码的,密码不可能是负数啊,不过我还是不知道他为什么搞那么麻烦,而不直接~buff ,晕。
      

  4.   

    负数也可以取反后再改变首位(符号位)啊((~(1<<31))&buff[i]),还用循环来做,纯熟多余
      

  5.   

    int bit=(buff[i]>>j&1)==0?1:0; 
    b+=(1 <<j)*bit; 如果对二进制不熟悉的话 恐怕比较难理解了 
    这里很难用纯文字表述清楚 就简略说一下作用
    byte是8位二进制
    int bit=(buff[i]>>j&1)==0?1:0;右移相应的位数和1做与操作,用来模拟二进制
    b+=(1 <<j)*bit; 计算出对应位应表示的十进制,然后组成该字节对应的十进制数字
      

  6.   


    private  byte[] change(byte[] buff){ 
    for(int i =0;i<buff.length;i++)
    {
    buff[i]=(byte)~buff[i];
    }
    return buff;
    }