[红外] 求一个数的反码, 并作为高位追加到 这个数的前面

发现网上很多求反码的教程都是, 但是不一定是对的

NEC红外协议有一个规定,  usercode = data反码(高位) data(低位) 

例如: 0x4C 需要转为:  0xB34C 其中B3是4C的反码



代码
    public int getUserCode(int dcode) {
        return dcode + ((dcode ^ 0x000000FF) << 8);  //注意 << 优先级低于+, 如果没有小括号,会先+再<< 
    }


计算方案:


算法 1 

        int dcode = 0x4C;  
        LogUtil.d("dcode" + dcode);  
        int rcode = (0x4C ^ 0x000000FF) << 8; //求4C的反码, 然后右移8位
        int userCode = dcode + rcode;
        LogUtil.d("userCode " + userCode);
        LogUtil.d("0xB34C " + 0xB34C); //最后的结果验证

0.      一个int 是32位, 四个字节 十六进制表示:     00 00 00 00
1.      0x4c =  内存中 00 00 00 4C
2.      0x4c ^ 0x000000FF= 内存中 00 00 00 B3
3.      (0x4c ^ 0xff) <<8  =  00 00 B3 00  //一定注意,.  这是16进制, 每一个数字表示4位  <<8 之后就是   
00 00 B3 00 
4       00 00 B3 00 +  00 00 00 4C = 00 00 B3 4C 
                
算法2:

                int dcode = 0x4C; 
                LogUtil.d("dcode" + dcode);
                int rcode = ~dcode << 8; // 求4C的反码, 然后右移8位
                int userCode = dcode + rcode;
                LogUtil.d("userCode " + (userCode & 0xffff));
                LogUtil.d("0xB34C " + 0xB34C); //最后的结果验证 

0.      一个int 是32位, 四个字节 十六进制表示:     00 00 00 00
1.      0x4c =  内存中 00 00 00 4C
2.      ~0x4c  内存中 FF FF FF B3
3.      ~0x4c << 8 内存中 FF FF B3 00
4.      dcode + rcode = FF FF B3 4C
5.     ( dcode + rcode) & 0xFFFF = 0000 B3 4C

你可能感兴趣的:([红外] 求一个数的反码, 并作为高位追加到 这个数的前面)