前言

Github:https://github.com/HealerJean

博客: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进制

1556161256797

2.2、2进制转10进制

1556161307639

2.3、2进制换8进制

1556161335515

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)

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)

1556163305625

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));


    }


   

}


ContactAuthor