1、位运算的优点
位运算有着节省时间和空间的优点。
因为位运算的操作对象是二进制位,对计算机而言是非常简单直接,友好高效的。在简单的低成本处理器上,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销。
================================================
2、Java位运算细化划分可以分为按位运算和移位运算,见下表。
计算方式 | 计算符号 | 描述 | 运算规则 |
按位运算 | & | 与 | 两位都为1,那么结果为1 |
按位运算 | | | 或 | 有一位为1,那么结果为1 |
按位运算 | ~ | 非 | ~0 = 1,~1 = 0 |
按位运算 | ^ | 异或 | 两位不相同,结果为1 |
移位运算 | << | 左移 | 各二进制位全部左移N位,高位丢弃,低位补0 |
移位运算 | >> | 右移 | 各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1 |
移位运算 | >>> | 无符号右移 | 各二进制位全部右移N位,无论正负,都在高位插入0 |
对于计算机而言,万物皆0、1,所有的数字最终都会转换成0、1的表示,有3种体现形式,分别是:原码、反码和补码。
原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0,负数位该位为1.比如十进制的5如果用8个二进制位来表示就是00000101,-5就是10000101。
反码:正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。5的反码就是00000101,而-5的则为11111010。
补码:正数的补码是其本身,负数的补码在其原码的基础上,符号位不变,其余各位取反,最后+1。即在反码的基础上+1。5的反码就是00000101,而-5的则为11111011。
结论:那就是在计算机系统中,数字一律用补码来表示、运算和存储。
3、进制转换
3.1、十进制转换成二进制
3.1.1 正整数转二进制
要点:除二取余,倒序排列,高位补零。
方法:将正的十进制数除以二,得到的商再除以二,依次类推直至商为0或1时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零。
注:计算机内部表示数的字节单位是定长的,如8位,16位,或32位。所以,位数不够时,高位补零。
如:十进制的6转成8位二进制 应该是 110 前面补充5个0 00000110
十进制的5转成8位二进制 应该是 101 前面补充5个0 00000101
3.1.2 负整数转二进制
方法:先将对应的正整数转换成二进制后,对二进制取反,然后对结果再加1。
如:十进制的-6转成8位二进制 先是6转成二进制应该是 110 前面补充5个0 00000110 ,然后取反:11111001 再加二进制的1 11111010
十进制的-5转成8位二进制 先是5转成二进制应该是 101 前面补充5个0 00000101 ,然后取反:11111010 再加二进制的1 11111011
3.1.3 小数转二进制
方法:对小数点以后的数×2,取结果的整数部分,然后再用小数部分再×2,再取结果的整数部分……以此类推,直到小数部分为0或者位数足够为止。然后把取的整数部分按先后次序排列,就构成了二进制小数部分的序列。
注: 如果小数的整数部分有大于0的整数时,将整数转换成二进制,小数转换成二进制,然后加在一起。
3.2、二进制转换成十进制
3.2.1 整数二进制转换为十进制
方法:首先将二进制数补齐位数,首位如果是0就代表是正整数,如果首位是1则代表是负整数。
若首位是0的正整数,补齐位数以后,将二进制中的位数分别与对应的值相乘,然后相加得到的就为十进制。
若二进制补足位数后首位为1时,说明是负数,就需要先取反再换算。
3.2.2 小数二进制转换为十进制
方法:将二进制中的位数分别与对应的值相乘,然后相加,得到的值即为换算后的十进制。