二进制基础,JAVA应用

位运算,进制转换

import java.util.Arrays;

import org.junit.Test;

public class BinaryTest {
	
	/**
	 * 二进制位运算
	 */
	@Test
	public void testWeiYunSuan(){
		int num1 =6;
		int num2 =3;
		int num3 =1;
		int num4 =-6;
		//& 与运算,两位全为1,结果才为1
		//特殊用法:1.清零;2.取一个数中指定位;
		System.out.println("& 与运算");
		System.out.println(Integer.toString(num1)+"&"+Integer.toString(num2)+"="+Integer.toString(6&3));
		System.out.println(Integer.toBinaryString(num1)+"&"+Integer.toBinaryString(num2)+"="+Integer.toBinaryString(6&3));

		//|或运算:只要有一个为1,结果就为1;
		//特殊用法:1.对一个数据的某些位置置1;2.找到一个数,对应X要置1的位,该数的对应位为1;
		System.out.println("| 或运算");
		System.out.println(Integer.toString(num1)+"|"+Integer.toString(num2)+"="+Integer.toString(6|3));
		System.out.println(Integer.toBinaryString(num1)+"|"+Integer.toBinaryString(num2)+"="+Integer.toBinaryString(6|3));
		
		//^异或运算:两个相应位为“异”(值不同),则该位结果为1,否则为0;
		//特殊用法:1.使得定位翻转找一个数,对应X要翻转的各位,该数的对应为1,其余为0,此数与X对应位异或即可。
		//		2. 与0异或,为原来的值
		//		3. 两个变量交换值得方法;
		System.out.println("^异或运算");
		System.out.println(Integer.toString(num1)+"^"+Integer.toString(num2)+"="+Integer.toString(6^3));
		System.out.println(Integer.toBinaryString(num1)+"^"+Integer.toBinaryString(num2)+"="+Integer.toBinaryString(6^3));
		int A = 23;
		int B = 16;
		System.out.println("A=23;B=16;A=A^B;A="+Integer.toString(A^B));
		A=A^B;
		System.out.println("A=23;B=16;A=A^B;B=A^B;B="+Integer.toString(A^B));
		B=A^B;
		System.out.println("A=23;B=16;A=A^B;B=A^B;A=A^B;A="+Integer.toString(A^B));

		//~反码:将0变1,1变0
		System.out.println("~反码");
		System.out.println("~"+Integer.toString(num1)+"="+Integer.toString(~6));
		System.out.println("~"+Integer.toBinaryString(num1)+"="+Integer.toBinaryString(~6));

		//<< 左移:将一个运算对象的各二进制位,全部左移若干位(左边的二进制位丢弃,右边补0;)
		//若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2;
		System.out.println("<< 左移");
		System.out.println(Integer.toString(num1)+"<<"+Integer.toString(num3)+"="+Integer.toString(num1<<num3));
		System.out.println(Integer.toBinaryString(num1)+"<<"+Integer.toBinaryString(num3)+"="+Integer.toBinaryString(num1<<num3));

		//>> 右移:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
		System.out.println(">> 右移");
		System.out.println(Integer.toString(num1)+">>"+Integer.toString(num3)+"="+Integer.toString(num1>>num3));
		System.out.println(Integer.toBinaryString(num1)+">>"+Integer.toBinaryString(num3)+"="+Integer.toBinaryString(num1>>num3));
		System.out.println(Integer.toString(num4)+">>"+Integer.toString(num3)+"="+Integer.toString(num4>>num3));
		System.out.println(Integer.toBinaryString(num4)+">>"+Integer.toBinaryString(num3)+"="+Integer.toBinaryString(num4>>num3));

		//>>> 无符号右移:右移后左边空出的位用0来填充,右边的位被丢弃。
		System.out.println(">>> 无符号右移");
		System.out.println(Integer.toString(num1)+">>>"+Integer.toString(num3)+"="+Integer.toString(num1>>>num3));
		System.out.println(Integer.toBinaryString(num1)+">>>"+Integer.toBinaryString(num3)+"="+Integer.toBinaryString(num1>>>num3));
		System.out.println(Integer.toString(num4)+">>>"+Integer.toString(num3)+"="+Integer.toString(num4>>>num3));
		System.out.println(Integer.toBinaryString(num4)+">>>"+Integer.toBinaryString(num3)+"="+Integer.toBinaryString(num4>>>num3));
		
		//原码:一个整数按照绝对值大小转换成的二进制数称为原码。
		//反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码;
		//补码:反码加1称为补码。
		//负数以其正值的补码形式表示。
		/**
		 * 位运算	功能	示例
			x >> 1	去掉最后一位	101101->10110
			x << 1	在最后加一个0	101101->1011010
			x << 1 | 1	在最后加一个1	101101->1011011
			x | 1	把最后一位变成1	101100->101101
			x & -2	把最后一位变成0	101101->101100
			x ^ 1	最后一位取反	101101->101100
			x | (1 << (k-1))	把右数第k位变成1	101001->101101,k=3
			x & ~ (1 << (k-1))	把右数第k位变成0	101101->101001,k=3
			x ^(1 <<(k-1))	右数第k位取反	101001->101101,k=3
			 x & 7	取末三位	1101101->101
			x & (1 << k-1)	取末k位	1101101->1101,k=5
			x >> (k-1) & 1	取右数第k位	1101101->1,k=4
			x | ((1 << k)-1)	把末k位变成1	101001->101111,k=4
			x ^ (1 << k-1)	末k位取反	101001->100110,k=4
			x & (x+1)	把右边连续的1变成0	100101111->100100000
			x | (x+1)	把右起第一个0变成1	100101111->100111111
			x | (x-1)	把右边连续的0变成1	11011000->11011111
			(x ^ (x+1)) >> 1	取右边连续的1	100101111->1111
			x & -x	去掉右起第一个1的左边	100101000->1000
			x&0x7F	取末7位	100101000->101000
			x& ~0x7F	是否小于127	001111111 & ~0x7F->0
			x & 1	判断奇偶	00000111&1->1
		 */
	}
	/**
	 * JAVA内置的进制转换;
	 */
	@Test
	public void testBinary(){
		Integer num1 = 60;
		//十进制转成16进制;
		System.out.println("54,十进制转成16进制,54="+Integer.toHexString(num1));
		//十进制转成8进制;
		System.out.println("54,十进制转成8进制,54="+Integer.toOctalString(num1));
		//十进制转成2进制;
		System.out.println("54,十进制转成2进制,54="+Integer.toBinaryString(num1));
		
		//16进制转成十进制;
		System.out.println("FF,16进制转成十进制,FF="+Integer.valueOf("FF",16).toString());
		//8进制转成十进制;
		System.out.println("74,8进制转成十进制,74="+Integer.valueOf("74",8).toString());
		//2进制转成十进制;
		System.out.println("0101,2进制转成十进制,0101="+Integer.valueOf("0101",2).toString());
	}
	/**
	 * java中的进制
	 * 
	 */
	@Test
	public void testJavaBinary(){
		/**
		 * 基本类型有4种:
		 * int数据类型:byte(8bit,-128~127),short(16bit),int(32bit),long(64bit)
		 * float数据类型:float(32bit),double(64bit)
		 * boolean数据类型:值为ture/false
		 * char数据类型:unicode字符,16bit;
		 * 对应的类类型:
		 * Integer,Float,Boolean,Character,Double,Short,Byte,Long
		 */
		
		//1.数据类型转化字节
		Integer employeeId = 8143;
		System.out.println("8143转化为2进制字符串:"+Integer.toBinaryString(employeeId));
		System.out.println("8143转化为16进制字符串:"+Integer.toHexString(employeeId));
		byte[] b = "8143".getBytes();
		System.out.println("8143转化字节:"+ Arrays.toString(b));
		System.out.println("8143第1个(低端)字节:8143>>0*8&0xff="+Integer.toBinaryString(employeeId>>0*8&0xff)+"="+Integer.toString(employeeId>>0*8&0xff));
		System.out.println("8143第2个(低端)字节:8143>>1*8&0xff="+Integer.toBinaryString(employeeId>>1*8&0xff)+"="+Integer.toString(employeeId>>1*8&0xff));
		System.out.println("8143第3个(低端)字节:8143>>2*8&0xff="+Integer.toBinaryString(employeeId>>2*8&0xff)+"="+Integer.toString(employeeId>>2*8&0xff));
		System.out.println("8143第4个(低端)字节:8143>>3*8&0xff="+Integer.toBinaryString(employeeId>>3*8&0xff)+"="+Integer.toString(employeeId>>3*8&0xff));
		//int转华为byte;
		byte[] arr = new byte[4];
		for(int i=0;i<arr.length;i++){
			arr[i] = (byte) (employeeId>>i*8&0xff);
		}
		System.out.println("8143转化为byte[]:"+Arrays.toString(arr));
		//1.小端法(Little-Endian):低位字节排放在内存的低地址端,即该值得起始地址,高位字节排放在内存的高地址端;
		//eg:0x12345678存放:0x78,0x56,0x34,0x12
		//2.大端法(Big-Endian):高位字节排放在内存的低地址端,即该值得起始地址,低位字节排放在内存的高地址端;
		//eg:0x12345678存放:0x12,0x34,0x56,0x78 =====
		System.out.println("大端法");
		//byte[]转化为Int;
		int covertNum = 0;
		for(int i=0;i<arr.length;i++){
			covertNum+=(arr[i]&0xff)<<i*8;
		}
		System.out.println("byte[]转化为Int:"+covertNum);
		
		//字符串-》字节数组:byte[] bs = str.getBytes();
		
		//字节数组转字符串:String s = new String(bs);|new String(bs,encode);
		
		//int转华为byte;
	}
}


运行结果:

8143转化为2进制字符串:1111111001111
8143转化为16进制字符串:1fcf
8143转化字节:[56, 49, 52, 51]
8143第1个(低端)字节:8143>>0*8&0xff=11001111=207
8143第2个(低端)字节:8143>>1*8&0xff=11111=31
8143第3个(低端)字节:8143>>2*8&0xff=0=0
8143第4个(低端)字节:8143>>3*8&0xff=0=0
8143转化为byte[]:[-49, 31, 0, 0]
大端法
byte[]转化为Int:8143
& 与运算
6&3=2
110&11=10
| 或运算
6|3=7
110|11=111
^异或运算
6^3=5
110^11=101
A=23;B=16;A=A^B;A=7
A=23;B=16;A=A^B;B=A^B;B=23
A=23;B=16;A=A^B;B=A^B;A=A^B;A=16
~反码
~6=-7
~110=11111111111111111111111111111001
<< 左移
6<<1=12
110<<1=1100
>> 右移
6>>1=3
110>>1=11
-6>>1=-3
11111111111111111111111111111010>>1=11111111111111111111111111111101
>>> 无符号右移
6>>>1=3
110>>>1=11
-6>>>1=2147483645
11111111111111111111111111111010>>>1=1111111111111111111111111111101
54,十进制转成16进制,54=3c
54,十进制转成8进制,54=74
54,十进制转成2进制,54=111100
FF,16进制转成十进制,FF=255
74,8进制转成十进制,74=60
0101,2进制转成十进制,0101=5


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值