二进制位运算应用

来源:互联网 发布:淘宝购物优惠微信群 编辑:程序博客网 时间:2024/05/21 17:43

常见的二进制位运算:

运算符运算示例&与运算6&3=2|或运算6|3=7^异或运算6^3=5~反码~6=-7<<左移3<<2=12相当于3*2*2=12>>右移3>>1=1相当于3/2=1>>>无符号右移3>>>1=1相当于3/2=1

二进制位运算优点:特定情况下,计算方便,速度快,被支持面广

如果用算数方法,速度慢,逻辑复杂



按位与 &:

     两位全为1,结果才为1

                  0&0=0;     0&1=0;      1&0=0;          1&1=1;

                  例如:51&5      即0011  0011 & 0000 0101=0000 0001   因此51&5=1


     位运算的特殊用法          

                  (1) 清零。

                              若想将一个单元清零,即 使其全部二进制位为零,只要与一个各位都为0的数值,结果为0


                (2)取一个数中指定位

                                例:设X=10101110,取X的低4位,用X&0000 1111=0000 1110即可得到

                    方法:找一个数,对应X要取的位,该数的对应位为1,其余位为0,此数与X进行"与运算"可以得到X中指定的位





按位或 |:

只要有一个为1,结果就为1

                    0|0=0;      0|1=1;    1|0=1;    1|1=1;

                   例如:51|5  即0011 0011 | 0000 0101=0011 0111  因此51 | 5=55


或运算的特殊用法

    常用来对数据的某些位置1

                    例:将X=10100000的低4位置1,用10100000 | 00001111=10101111即可得到

    方法:找到一个数,对应X要置1的位,该数的对应位为1,其余为0,此数与X相或可使X的对应位置1





异或运算 ^:

两个相应位为"异"(值不同),则"异或"结果为1,否则为0

       0^0=0;    0^1=1;   1^0=1;    1^1=0;

   例如:51^5  即  0011 0011 ^ 0000 0101=0011 0110  因此51 ^ 5=54


异或运算的特殊用途

               (1)使特定位翻转

                找一个数,对应X要翻转的各位,该数对应位1,其余位为0

                如:X=1010 1110,使X低四位翻转,用X ^ 0000 1111=1010 0001即可得到


               (2)与0相异或,保留原值

                例:X ^ 0000 0000=X


               (3)两个变量交换值

一般的方法有:借助第三个变量实现(C=A;A=B;B=C)

                      利用加减法实现两个变量的交换(A=A+B;B=A-B;A=A-B)

                      不过用位异或运算来实现,还是效率最高

                    原理:一个数异或本身等于0;异或运算符符合交换率

                    如:A=A^B; B=A^B; A=A^B;





无符号右移运算>>>:

各个位向右移指定的位数,右移后左边空出的位用0填充,移出右边的位被丢弃

            例如:-14>>>2

             即   11111111 11111111 11111111 11110010   >>>2=00111111 11111111 11111111 11111100    即1073741820





JAVA内置的进制转换

十进制转换十六进制: Integer.toHexString(int i)

十进制转换八进制:Integer.toOctalString(int i);

十进制转换二进制:Integer.toBinaryString(int i)

十六进制转换十进制:Integer.parseInt("FFFF",16);

八进制转换十进制:Integer.parseInt("376",8).;

二进制转换十进制:Integer.parseInt("0101",2);




数据类型转换字节

例: 8143(00000000 00000000 00011111 11001111)

=>byte[] b=[-49,31,0,0]

第一个低端字节:8143>>0*8&0xff=110011111=207(或有符号-49)

第二个低端字节:8143>>1*8&0xff=00011111=31

第三个低端字节:8143>>2*8&0xff=00000000=0

第四个低端字节:8143>>3*8&0xff=00000000=0




大小端


小端法:低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端

大端法:低位字节排放在内存的高地址端,位字节排放在内存的低地址端即该值的起始地址

例如:32位宽的数0x12 34 56 78

   小端模式下CPU内存中的存放方式为:

内存地址0x40000x4001ox40020x4003存放内容0x780x560x340x12

   大端模式下CPU内存中的存放方式为:

内存地址0x40000x40010x40020x4003存放内容0x120x340x560x78


参考文章:http://blog.csdn.net/iukey/article/details/7195265