位运算,进制转换
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