位运算符
前言
博主github
博主个人博客http://blog.healerjean.com
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进制
[外链图片转存失败(img-aAbWQZCc-1566804664207)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages\1556161256797.png)]
2.2、2进制转10进制
[外链图片转存失败(img-zWapzqxm-1566804664207)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages\1556161307639.png)]
2.3、2进制换8进制
[外链图片转存失败(img-Ipge5Yvm-1566804664208)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages\1556161335515.png)]
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
//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)
[外链图片转存失败(img-OYEw1mRq-1566804664209)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages\1556163305625.png)]
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中,所有数据的表示方法都是以补码的形式表示,正数的补码是它本身,负数的补码是其绝对值的原码取反,末尾再加1。
//如果没有特殊说明, Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是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));
打印
10 二进制 1010
^ 非运算:-11 二进制:11111111111111111111111111110101 0101 可逆推 0100 1011 = 11 -> -11
11
原码 1011
取反 0100
加1 0101
高位设置为 1
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,int数据类型的长度是8位,一位是四个字节,就是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));
}
}
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|