/**
*@Title: ${filename}
*@Package: ${package_name}
*@Description: ${todo}
*位运算符
左移<<
右移>>
与 &
或 |
异或 ^
反码 ~
*
*@author: 源代码资料尽在"清哥好课堂"公众号:qghktit
*@date: ${date}${time}
*@version: 1.0
*/
public class BitwiseOp
{
public static void main(String[] args)
{
/*
反码 ~
以补码进行运算
取反,符号位也要参与运算, 1-->0 0-->1
*/
System.out.println(~5);
/*
5补码 0000-0000 0000-0000 0000-0000 0000-0101
~5结果1111-1111 1111-1111 1111-1111 1111-1010
结果是一个负数,补码转原码
结果的原码
1000-0000 0000-0000 0000-0000 0000-0110
结果:-6
*/
System.out.println(~-5);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
~-5结果: 0000-0000 0000-0000 0000-0000 0000-0100
结果 是一个正数,补码和原码相同
结果 4
*/
}
public static void main5(String[] args)
{
/*
异或 ^
相同为0,不同为1
1^1 = 0 0^0=0
1^0 = 1 0^1=1
以补码参与运算
*/
System.out.println(5^6);
/*
5补码 0000-0000 0000-0000 0000-0000 0000-0101
6补码 0000-0000 0000-0000 0000-0000 0000-0110
结果:0000-0000 0000-0000 0000-0000 0000-0011
3
*/
System.out.println(5^6^5);
/*
5补码 0000-0000 0000-0000 0000-0000 0000-0101
6补码 0000-0000 0000-0000 0000-0000 0000-0110
结果:0000-0000 0000-0000 0000-0000 0000-0011
5补码 0000-0000 0000-0000 0000-0000 0000-0101
结果 0000-0000 0000-0000 0000-0000 0000-0110
6
一个数与同一个数异或两次,得到它自己
*/
System.out.println(-5^6);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
6补码 0000-0000 0000-0000 0000-0000 0000-0110
结果 1111-1111 1111-1111 1111-1111 1111-1101
是一个负数,补码转原码
结果的原码 1000-0000 0000-0000 0000-0000 0000-0011
-3
*/
System.out.println(-5^6^6); //-5
System.out.println(-5^-6);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
-6的原码 1000-0000 0000-0000 0000-0000 0000-0110
-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
-5^-6结果 0000-0000 0000-0000 0000-0000 0000-0001
结果 是正数
1
*/
System.out.println(-5^-6^-6); //-5
System.out.println(-5^-6^-5); //-6
}
public static void main4(String[] args)
{
/*
或 |
补码进行运算
0|0=0
1|0=1
0|1=1
1|1=1
只要有1就是1
*/
System.out.println(5|6);
/*
5补码 0000-0000 0000-0000 0000-0000 0000-0101
6补码 0000-0000 0000-0000 0000-0000 0000-0110
结果: 0000-0000 0000-0000 0000-0000 0000-0111
7
*/
System.out.println(-5|6);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
6补码 0000-0000 0000-0000 0000-0000 0000-0110
-5|6的结果 1111-1111 1111-1111 1111-1111 1111-1111
结果是一个负数,负数补码转原码
结果的原码 1000-0000 0000-0000 0000-0000 0000-0001
-1
*/
System.out.println(-5|-6);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
-6的原码 1000-0000 0000-0000 0000-0000 0000-0110
-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
-5|-6结果:1111-1111 1111-1111 1111-1111 1111-1011
结果是一个负数 负数补码转原码
结果的原码 1000-0000 0000-0000 0000-0000 0000-0101
-5
*/
}
public static void main3(String[] args)
{
//与 &
/*
补码参与运算
1&1=1
1&0=0
0&1=0
0&0=0
只要有0就是0
*/
System.out.println(5&6); //4
/*
5补码 0000-0000 0000-0000 0000-0000 0000-0101
6补码 0000-0000 0000-0000 0000-0000 0000-0110
结果 0000-0000 0000-0000 0000-0000 0000-0100
4
*/
System.out.println(-5&6); //2
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
6补码 0000-0000 0000-0000 0000-0000 0000-0110
-5&6的结果 0000-0000 0000-0000 0000-0000 0000-0010
结果为一个正数, 补码和原码相同
转十进制 2
*/
System.out.println(-5&-6);
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
-6的原码 1000-0000 0000-0000 0000-0000 0000-0110
-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
-5&6的结果 1111-1111 1111-1111 1111-1111 1111-1010
结果为一个负数,负数的补码转原码
结构的原码 1000-0000 0000-0000 0000-0000 0000-0110
转十进制 -6
*/
}
public static void main2(String[] args)
{
//右移>> 正数是每右移一位,除2
//右移运算,往右移,低位会被移出,高位上要补
//补,符号位上的数,要是正数补0。要负数,补1
System.out.println(5>>1); //2 5/2=2
/*
在补码的基础上进行
5 的补码就是其原码
0000-0000 0000-0000 0000-0000 0000-0101
5>>1之后的结果
0 0000-0000 0000-0000 0000-0000 0000-010
*/
System.out.println(5>>2); // 1 5/2/2=1
System.out.println(5>>3); // 0 5/2/2/2=0
System.out.println(-5>>1); //-3
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
-5>>1的结果
1111-1111 1 111-1111 1 111-1111 1 111-1101
结果是一个补码
转成原码
1000-0000 0000-0000 0000-0000 0000-0011
转十进制
-3
*/
System.out.println(-5>>2); //-2
System.out.println(-5>>3); //-1
System.out.println(-5>>4); //-1
System.out.println(-5>>5); //-1
}
public static void main1(String[] args)
{
/*
数 用二进制来表示 用多少位来,机器字长来决定
机器字长32位, 4个8位,即4个字节
研究的是带符号的数,正数,负数
符号位, 最高位,最左边的位 0 表示正数,1表示负数
符号位1 数据位31
在计算机当中,数的编码格式,有四种
原码
(反码)
补码
对于正数来说,原码和补码相同
对于负数来说,原码的基础上得到补码,
在原码的基础上,除符号位以外,其它位分别取反, + 1,得到补码
补码-->原码
在补码的基础上,除符号位以外,其它位分别取反后+1,得到原码
*/
//左移<< 正数 右边空位(低位上补0)
System.out.println(5<<1); //5左移一位,变成10 5*2
System.out.println(5<<2); //5左移两位,变成20 5*2*2
//对于正数,左移<< 每移一位,相于乘2
System.out.println(-5<<1); //-10 -5*2
/*
-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
-5<<1
高位移出, 低位补0
x结果: 1】111-1111 1111-1111 1111-1111 11111-0110
结果 是一个补码
转成原码后才能转成十进制
结果的原码:1000-0000 0000-0000 0000-0000 0000-1010
-10
*/
System.out.println(-5<<2); //-20
}
}