分享

位运算符

 清哥好课堂 2022-06-01 发布于湖南


清哥好课堂

《最受欢迎的精准提升平台》

位运算符
/***@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 }}

清哥好课堂公众号

微信号 : qghktit

新浪微博:清哥好课堂

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多