不仅限于Java 我们必须要了解的Java位运算( 二 )


互相转换、注意事项注意:我们在最初的基本概念中提到了二进制和十进制的转换方式 。但是需要知道的是,一个数在计算机中的二进制表示方式叫做机器数 。
而机器数是有符号的,我们将对应的最高位存放符号,0位正数,1位负数 。所以机器数并不等于二进制 。
由此我们才引出了真值的概念,例如:符号数 10000011,在十进制中对应的值为131,但是在机器数中,由于1表示负数,所以其真正数值是-3,而并不是131 。
符号数:10000011,我们需要先消除其符号位的影响,将其调整为正数:00000011,此时将正数转换为10进制为3,然后再加上最初的符号位表示负数,所以为-3 。
需知道的是,二进制仅是以2为基数的计数方式而已,在二进制中是无法区分正数和负数的 。而如果想区分正数和负数那么必须在二进制的最高一位中用0和1来表示符号以此来表示正负 。那么此时最高位的0和1已经不是二进制的一种计数方式了,而只是一种符号的标识,该符号的标识则是万万不可以直接参与二进制的计算的 。
当我们用最高位中的0和1来表示正负时,此时该二进制的数已经不再是符合二进制规则的数了,而是机器数 。
二进制仅仅是以2为基数的计算方式,此时最高位的值已经不再是通过2位基数的计算方式而计算出来的,而只是一个表示正负的标识了,所以此时该数值则已经不再是符合二进制规则的数了,而是机器数 。
所以,也只有机器数才可以表示正负 。而机器数所对应得到的结果则是真数,而并不是10进制数 。
如果此时抛出来一个问题:10000011 转换为对应的10进制,那么对应的结果则是131,但如果是转换为真数,则是-3 。同样的,如果是将00000011 转换为对应的10进制,则是3,而如果转换为真数,则也是3 。
所以当我们看到一个以8位数所表示的二进制数时,则一定要确认该二进制数是表示机器数,还是二进制数?是转换为10进制数,还是真数 。其中最大的区别则是,最高的符号位到底是参与二进制的运算,还是仅仅表示符号位 。
机器数转真数:
10000011 >消除最高位1的影响先转为正数>00000011>再将该正数以二进制的方式转为十进制为> 3 >此时再将最初的符号添加回来>3调整为-3 。
二进制数转10进制数:
10000011 >无需消除最高位1的影响直接转为正数>10000011>再将该正数以二进制的方式转为十进制为 > 131>无需添加符号位>131仍然为131 。
所以可知,真数和10进制数最大的区别则是是否忽略最高位,在确认完是否忽略最高位,得到最初的正数后,该正数的计算方式,则和二进制转十进制的方式完全相同 。其实就是二进制转十进制 。哈哈 。


推荐阅读