常见的二进制位运算:
运算符 | 运算 | 示例 |
& | 与运算 | 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内存中的存放方式为:
内存地址 | 0x4000 | 0x4001 | ox4002 | 0x4003 |
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
大端模式下CPU内存中的存放方式为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
参考文章:http://blog.csdn.net/iukey/article/details/7195265