进制转换和位运算符
前言
Github:https://github.com/HealerJean
1、字节描述
一个字节为8位二进制位。
字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
1B(byte,字节)= 8 bit(位);
数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
2、进制转换
128 64 32 16 8 4 2 1
2.1、10进制转2进制
2.2、2进制转10进制
2.3、2进制换8进制
3、位移运算符
3.1、左移运算符 «
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
// << 左移运算符,相当于乘以 2 (二进制 加 一位)
int l = n << 1 ; //1010 -> 10100 16 + 0 + 4 + 0 + 0 = 20
System.out.println("n << 1 左移运算符"+l); //20
l = n << 2 ; //1010 -> 101000 32 + 0 + 8 + 0 + 0 + 0 = 40
System.out.println("n << 2 左移运算符"+l);// 40
3.2、右移运算符 »
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
// >> 右移运算符 ,相当于除以 2 (二进制 减 一位)
int r= n >> 1 ; //1010 -> 0101 4 + 0 + 1 = 5
System.out.println("n >> 1 右移运算符"+r); //5
3.3、无符号运算符 »>
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
无符号位移(>>>)和有符号位移(>>)的区别是
有符号位移运算时如果数字为正数时位移后在前面补0,为负数时则在位移后在前面补1
100的二进制是 01100100
无符号位移(>>>)向右移2位后为 00011001 最后结果为25 100>>>2==25
有符号位移(>>) 向右移2位后为 00011001 100>>2==25
//res = 20 >>> 2; 的结果与 >> 相同;
//无符号右移(忽略符号位,空位都以0补齐,不论是正数还是负数,都是补0),也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。
3.4、按位与运算 & (都是1 为 1)
int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int y = s&e ;
System.out.println("& 与运算:"+s+"&"+e+"="+y+" 二进制:"+Integer.toBinaryString(y));
打印
10 二进制 1010
8 二进制 1000
& 与运算:10&8=8 二进制:1000
3.5、按位或运算 | (任意一个有1为1)
int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int h = s|e ;
System.out.println("| 或运算:"+s+"|"+e+"="+h+" 二进制:"+Integer.toBinaryString(h));
打印
10 二进制 1010
8 二进制 1000
| 或运算:10|8=10 二进制:1010
3.6、按位异或 运算 ^ (不相同为1)
int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int yh =s^e ;
//然后从高位开始比较,如果相同则为0,不相同则为1。
System.out.println("^ 异或运算:"+s+"^"+e+"="+yh+" 二进制:"+Integer.toBinaryString(yh));
打印
10 二进制 1010
8 二进制 1000
^ 异或运算:10^8=2 二进制:0010
3.7、按位取反 ~
int s = 10 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
//如果没有特殊说明, Java中的数据类型默认是int,int是四个字节,就是32bit
//10 的二进制 其实 应该为 00000000 00000000 00000000 00001010
//~s 运算规则:如果位为0,结果是1,如果位为1,结果是0.
// 11111111 11111111 11111111 11110101
原反补:
正数:原码=反码=补码
负数:反码=原码的所有位(符号位除外)取反
补码=反码+1
//在Java中,所有数据的表示方法都是以补码的形式表示,正数的补码是它本身,负数的补码是其绝对值的原码取反,末尾再加1。
^ 非运算:-11 二进制:11111111111111111111111111110101 0101 可逆推 0100 1011 = 11 -> -11
11
原码 1011
取反 0100
加1 0101
高位设置为 1
3.8、一个字节的取值范围为什么是-128~127呢:
一个字节有8位,第1位是符号位,1代表负数,0代表正数。
所以一个字节:
最小正数二进制是0000 0000=0
最大正数二进制是0111 1111 = 64+32+16+8+4+2+1=127
(下面关于负数,不要计较第一位是不是符号位)
最小负数二进制是1000 0000 → 减一: 0111 1111 取反: 1000 0000 = 128 所以应该为 - 128
最大负数二进制是1111 1111 → 减一: 1111 1110 取反: 0000 0001 = 1 所以应该为 - 1
如果带符号,需要用1位表示符号(1表示负数,0表示正),剩下7位表示数据. 那么表示范围是-128—127(包括-0和+0).
如果不带符号,8位全部表示数据, 那么表示范围是 0–256
package com.hlj.util.Z006运算符;
import org.junit.Test;
/**
* @Description
* @Author HealerJean
* @Date 2019/3/18 下午9:30.
*/
public class Z001位移运算符 {
/**
* 1 2 4 8 16
* 后面的数字代表移动几位
*/
@Test
public void 左移运算符(){
int n = 10 ; //转化为二进制 1010
System.out.println(Integer.toBinaryString(n)); // 1010
// << 左移运算符,相当于乘以 2 (二进制 加 一位)
int l = n << 1 ; //1010 -> 10100 16 + 0 + 4 + 0 + 0 = 20
System.out.println("n << 1 左移运算符"+l); //20
l = n << 2 ; //1010 -> 101000 32 + 0 + 8 + 0 + 0 + 0 = 40
System.out.println("n << 2 左移运算符"+l);// 40
// >> 右移运算符 ,相当于除以 2 (二进制 减 一位)
int r= n >> 1 ; //1010 -> 0101 4 + 0 + 1 = 5
System.out.println("n >> 1 右移运算符"+r); //5
//res = 20 >>> 2; 的结果与 >> 相同;
//无符号右移(忽略符号位,空位都以0补齐,不论是正数还是负数,都是补0),也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。
}
@Test
public void 异或运算符(){
int s = 10 ;
int e = 8 ;
System.out.println(s+"二进制"+Integer.toBinaryString(s));
System.out.println(e+"二进制"+Integer.toBinaryString(e));
int y = s&e ;
System.out.println("& 与运算:"+s+"&"+e+"="+y+" 二进制:"+Integer.toBinaryString(y));
int h = s|e ;
System.out.println("| 或运算:"+s+"|"+e+"="+h+" 二进制:"+Integer.toBinaryString(h));
int yh =s^e ;
//然后从高位开始比较,如果相同则为0,不相同则为1。
System.out.println("^ 异或运算:"+s+"^"+e+"="+yh+" 二进制:"+Integer.toBinaryString(yh));
//在Java中,所有数据的表示方法都是以补码的形式表示,正数的补码是它本身,负数的补码是其绝对值的原码取反,末尾再加1。
//如果没有特殊说明, Java中的数据类型默认是int,四个字节,就是32bit
//10 的二进制 其实 应该为 00000000 00000000 00000000 00001010
//~s 运算规则:如果位为0,结果是1,如果位为1,结果是0.
// 11111111 11111111 11111111 11110101
int f = ~s ;
System.out.println("^ 非运算:"+f+" 二进制:"+Integer.toBinaryString(f));
}
}