Java中的位运算

2021-06-08 09:04

阅读:341

标签:设计   架构设计   空间   nbsp   运算   对象   加法   计算机系   说明   

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 小数二进制转换为十进制

方法:将二进制中的位数分别与对应的值相乘,然后相加,得到的值即为换算后的十进制。

Java中的位运算

标签:设计   架构设计   空间   nbsp   运算   对象   加法   计算机系   说明   

原文地址:https://www.cnblogs.com/controller666/p/14531601.html


评论


亲,登录后才可以留言!