位运算符

前言

博主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)

1556163357205

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)

1556163341678

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 
取反 01001  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));


    }


   

}




感兴趣的,欢迎添加博主微信

哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦

微信 微信公众号 支付宝
微信 微信公众号 支付宝
posted @ 2019-04-25 11:52  HealerJean  阅读(130)  评论(0编辑  收藏  举报