您的位置:首页 > 编程语言 > Java开发

java 位移,二进制、八进制、十进制、十六进制,超详解析!适合初学者!

2014-11-25 22:20 369 查看
如果有不妥之处,请给予留言纠正,谢谢!本文仅限于学习。

1.进制间的转换

[java] view
plaincopyprint?

public class HexConversion

{

/**

* TODO 进制转换。

*

* @param args

*/

public static void main(String[] args)

{

/**

* 基本原理 二进制——>十进制

*

* 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13

*

* 八进制——>十进制

*

* 1101(8)=1*8^0+0*8^1+1*8^2+1*8^3=1+0+64+512=577

*

* 425(8) = 5*8^0+2*8^1+4*8^2 = 5+16+256=277

*

* 十六进制——>十进制

*

* 1101(16)=1*16^0+0*16^1+1*16^2+1*16^3=1+256+4096=4353

*

* AF(16) = 15*16^0 + 10*16^1 = 15+160=175

*

* 二进制——>八进制

*

* (1100100)2=(001 100 100)2=(1 4 4)8=(9)2

*

* 二进制——>十六进制

*

* 1000 1001 1010 1011 1100 1101 1110 1111 =(89ABCDEF)16

*/

//十进制的10格式化成16进制输出 "\n"换行

System.out.printf("%x \n", 10);

/**

* 十进制转二进制

*

* 4的二进制为100,2等于10

*

* 十进制18等于二进制4*4+2 = 10000+10

*

* result 10010

*/

System.out.println("数值:为18的十进制转二进制:"+Integer.toBinaryString(18));

/**

* 方法二:

* 求102.8125的二进制

* 根据十进制转二进制换算

* 25除以2 12余1

* 12除以2 6余0

* 6除以2 3余0

* 3除以2 1余1

* 1除以2 0余1

* 十进制25的二进制为11001

*

* 十进制0.8125的二进制为:

* 小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列

* 。

* 0.8125x2=1.625 取整1,

*

* 小数部分是0.6250.625x2=1.25 取整1,

*

* 小数部分是0.250.25x2=0.5 取整0,

*

* 小数部分是0.50.5x2=1.0 取整1,

* 小数部分是0,结束

*

* 结果:11001.1101

*/

/**

* 二进制转十进制

*/

String v1 = "10010";

System.out.println("数值:为10010的二进制转十进制:"+Long.parseLong(v1,2));

//法二:

int r1 = (int)(0*Math.pow(2, 0)+1*Math.pow(2, 1)

+0*Math.pow(2, 2)+0*Math.pow(2, 3)+1*Math.pow(2, 4));

System.out.println("法二: 数值:为10010的二进制转十进制:"+r1);

/**

* 十进制转八进制

*

* 十进制18等于八进制8,8,2 ; 10+10+2=22

*

* result 22

*/

System.out.println("数值:为18的十进制转八进制:"+Integer.toOctalString(18));

/**

* 八进制转十进制

*/

String v2 = "22";

System.out.println("数值:为22的八进制转十进制:"+Long.parseLong(v2,8));

//法二:

int r2 = (int)(2*Math.pow(8, 0)+2*Math.pow(8, 1));

System.out.println("法二: 数值:为22的八进制转十进制:"+r2);

/**

* 十进制转十六进制

*

* 十进制18等于十六进制16+2

*

* 十六进制16为10

*

* result 12

*/

System.out.println("数值:为18的十进制转十六进制 :"+Integer.toHexString(18));

//法二:十六进制 xx*16的0次幂+xx*16的一次幂.......

/**

* 二进制换算成八进制

*

* 2的3次幂为8,所以以每3位作为二进制换算成八进制的单位

*

* 如下100的二进制为4,110为6,101为5,1为1

*

* result 4+6+5+1 = 16

*/

String v3 = "100 110 101 1";

}

}

2.位移运算详解

[java] view
plaincopyprint?

public class Displacement

{

/**

* TODO 位移运算详解。

*

* @param args

*/

public static void main(String[] args)

{

/**

* ~ 位反 ~00110011 11001100 是0的就为1,是1的就为0

*

* & 位与 00110011&11101101 00100001 都为1的时候才为1 两个条件必须都成立

*

* | 位或 00110011|11100001 11110011 一个为1就取1,一个条件成立即可

*

* ^ 位异或 00110011^11100001 11010010 两个值都相同的时候取反,假如两个都为1,就取0

*

* << 左移 00110011<<2 11001100 x*2的y次幂

*

* >> 右移 10110011 >> 2 11101100 x/2y次幂(取整),或者先将值换算成二进制数,int型32位,不满32为的往左补0一直补满32,然后将值右移要移动位数。在换算成10进制数输出

*

* >>> 不带符号右移 10110011>>2 00101100

*/

/**

* << 左移

*

* 左移: 向左移动,右边补0。

*

* 公式:x<<y 即 x*2的y次方

*

* 详解 :

*

* p 方法一: 可以使用公式假如2<<3位 则公式为2*2的3次幂,结果:16

* p 方法二: 十进制的2,等价于二进制的10,左移是往右补0,所以往右补3个0

* 变成二进制的10000,将二进制的10000转成十进制就是:2的4次幂,结果:16

*

*/

System.out.println(2<<3);

System.out.println("2左移8位等价于2乘以2的8次幂"+2*Math.pow(2,8));

//采用二进制换算

System.out.println(Math.pow(2,11));

//采用是公式2*2^3(2*2的3次幂)

System.out.println(2*Math.pow(2,10));

/**

* >> 右移

*

* 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1

*

* 详解

* 例如102 >> 2 102除以2的2次幂,实际就是102/4取整,结果为:25

* 公式:x除以y取整

*

*/

System.out.println(102>>2);

/**

* 15的二进制

* 0000 0000 0000 0000 0000 0000 0000 1111

* 往左补4个0得到:

* 0000 0000 0000 0000 0000 0000 0000 0000

* 结果:0

*/

System.out.println(15>>4);

/**

* 15的二进制

* 0000 0000 0000 0000 0000 0000 0000 1111

* 往左补2个0得到:

* 0000 0000 0000 0000 0000 0000 0000 0011

* 结果:3

*/

System.out.println(15>>2);

/**

* 有符号右移高位补1。

*

* 例如:-13 >> 3

* 13的原码:0000 1101,带符号所以高位为1,即:1000 1101

* -13的补码为高位不变,其他7位原码取反,再加1。

* 1000 1101取反:1111 0010,加1后为:1111 0011

* -13的补码:1111 0011

*

* 换算结果:-13右移3位,左边补1 : 1111 1110

*

* 即:-13 >> 3的结果为:-2

* 看到这一步我想大家心里肯定有一个疑惑:明明是1111 1110,怎么结果变成了-2?

* 那么答疑一下:2的二进制:0000 0010 (实际就是上面说的原码)

* 那么补码1111 1101,加1后:1111 1110

*

* 最高位代表符号位

* 所以结果为:-2

*/

System.out.println(-13 >> 3);

/**

* 无符号右移,无符号右移高位补0。

*

* -3 >>> 2

* 3的原码:0000 0000 0000 0000 0000 0000 0000 0011

* -3的补码:1111 1111 1111 1111 1111 1111 1111 1101

*

* 右移两位得到:0011 1111 1111 1111 1111 1111 1111 1111

*/

//验证 将二进制111111111111111111111111111111转成十进制的结果是否和System.out.println(-3 >>> 2)一致。

System.out.println(Long.parseLong("111111111111111111111111111111", 2));

System.out.println(-3 >>> 2);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐