黑马程序员-位与进制转换

来源:互联网 发布:淘宝卖家帐号被冻结 编辑:程序博客网 时间:2024/05/22 10:59
------- android培训、java培训、期待与您交流! ----------

1.进制的理解:

进制就是进位制

X进制: 逢X进1

进制一共分为 二进制(binary),十进制,八进制(octal),十六进制(hex)

2.二进制

二进制的特点:由0和1组成,逢2进1

使用运算来表示的话就是 0+0=0  0+1=1 1+1=10  

如何由十进制转换成二进制?

除2运算,余数取反

将该十进制数不停的去除2,得到的余数取反的结果即为二进制数


 那么如何从十进制转换成二进制呢?

原理是: 乘二的次幂


其中,一个字节是八个位,所以它最大数为128+64+32+16+8+4+2+1 = 255


3.八进制

逢8进1 

由三个二进制位表示一个八进制

并且表示的时候前面要加一个0

十进制转八进制: 除八取余 并取反 与二进制是一样的过程


二进制如何转八进制?

90的二进制形式是 01011010

第一步: 将其改成三个三个的形式,因为一个八进制是三个二进制来表示,如果不足三位的可以补0   

001 011 010

第二步 : 得出他们的二进制数值  由此可以得出一个结论:为什么要使用三个二进制来表示一个八进制,因为三个二进制的最大值为 1+2+4=7 不会超过8 

1  3  2

第三步: 别忘了在前面加上0表示八进制

0132 


4.十六进制

逢16进1

由四个二进制位代表一个十六进制

表示十六进制要在前面加上0x的前缀

十进制和十六进制之间的转换和二进制八进制原理是一样的


二进制转十六进制

90的二进制形式 01011010

第一步: 将四个二进制分割开。

0101 1010  

第二步: 得出他们的二进制数值

0101 = 5  

1010 = 10 

十六进制的数有个特点,9以上为了避免10 11 这种写法使用ABCD这样的形式

所以最后得出的是5A

第三步:加上0x前缀

得出的结果是0x5A


5.负数二进制:整数的二进制取反+1

比如 取-6的二进制

第一步: 得出6的二进制

因为6是整数,整数是四个字节,也就是32位

所以6的二进制: 

00000000 00000000 00000000 00000110

第二步: 正数的二进制取反 得到反码,可以用符号~

   11111111 11111111 11111111 11111001

第三步: 反码+1 得到补码

     11111111 11111111 11111111 11111001

+   00000000 00000000 00000000 00000001

-------------------------------------------------------------------

     11111111 11111111 11111111 11111010

由上述的二进制可以得出一般的规律: 负数二进制的最高位为1,正数为0


5.位运算符详解

与 &      

或 |

非 !

异或 ^

实质上 每移动一位就是对这个二进制数的十进制形式乘以或者除以2

左移 <<   乘以2的移动位数次幂

左移途中,会碰到右边空出位数的情况,这时右边补0

右移 >>   除以2的移动位数次幂 

右移途中,会碰到左边空出位数的情况,这时左边看情况补

如果最高位为1,则补1 如果为0,则补0

无符号右移 >>>   因为是无符号,所以空出来的用0来补

& | ! 一定要区分开,逻辑运算符得出的结果一定是true或者false

而位运算符则是进行位的运算,可以将true看做1,false看做0

   110

&011

---------

   010


如果一个数异或一个数连续异或两次,结果还得这个数

7^4^4=7 


位运算的例子:

最有效率的求出2乘以8

第一步:确定要运算的数字 2和8

第二步: 确定运算方式为乘法,即左移

第三步: 确定要左移的位数: 3


异或的应用:

对两个整数变量进行互换(不使用第三方变量)

1.n = n + m;

   m = n - m ;

   n  = n - m;

这种方式容易损失精度,因为每个类型都有其最大值,容易超出精度

2.

n = n ^ m;

m = n ^ m

n = n ^ m;



6.进制转换代码

/*
     查表法进制转换
*/


class  ArrayTest
{
public static void main(String[] args) 
{
//函数入口
toHex(60);


    //公用进制转换方法 
    public static void trans(int num,int base,int offset)
{
//因为0的任何转换形式都为0
if (num == 0)
{
System.out.println(0);
return ;
}
//定义一个表,因为最高的转换是十六进制
//所以让这个字符数组存储十六进制的数值

//如果要转换二进制,则只需要取数组中前两位

//如果要转换八进制,则只需要取数组中前八位

//如果要转换十六进制,则只需要取数组中前八位
char[] chs = {'0','1','2','3','4',
         '5','6','7','8','9',
          'A','B','C','D','E','F'};
//定义临时容器
char[] arr = new char[32];   
int pos = arr.length ;
        
while (num != 0)
{

//2的八进制可以用另一种形式,即&7 

//算法:进制转换就是将要转换的进制数 & 要转换的进制-1(八进制即为7)

//所以base的值通常只有三个,1,7,15
int temp = num & base;

// 因为pos是数组的长度,所以要取角标的话,需要将本身的值-1得到数组的最大值。避免角标越界异常

// -- : 自减运算符  先将这个值进行-1再去做其他操作。
arr[--pos] = chs[temp];

//offset为转换进制的2的次幂数
num = num >>> offset;
}


for (int x = pos; x < arr.length ; x++ )
{
System.out.print(arr[x]);
}
}
/*
十进制-》二进制
*/
public static void toBin(int num)
{
trans(num,1,1);
}
/*
十进制-》八进制
*/
public static void toBa(int num)
{
trans(num,7,3);
}
/*
十进制-> 十六进制
*/
public static void toHex(int num)
{
trans(num,15,4);
}
}



7.java所提供的进制转换方法

1.static String toBinaryString(int i)

2.static String toOctalString(int i)

3.static String toHexString(int i)

此方法为静态,并且返回String类型,是Integer类中的方法。使用方法 String str = Integer.toBinaryString(30);





0 0
原创粉丝点击