Java学习笔记003——位运算细节

/**********************************************************************************
 *
 * 文件名: BitOperator.java
 * 
 * 描述:位运算 知识点+课后练习
 *
 * 知识点1:原码 反码 补码
 *		1.二进制的最高位是符号位:0表示正数,1表示负数
 * 		2.正数的原码、反码、补码都一样(三码合一)
 * 		3.负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
 * 		4.负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
 * 		5.0的反码、补码都是0
 * 		6.java没有无符号数,换言之,java中的数都是有符号的
 * 		7.在计算机运算的时候,都是以补码的方式来运算的(重点)
 * 		8.当我们看运算结果的时候,要看它的原码(重点)
 * 
 * 知识点2:按位与&	 按位或| 按位异或^ 按位取反~
 * 		按位与&		:		两位全为1,结果为1,否则为0
 * 		按位或|	 	:		两位有一个为1,结果为1,否则为0
 * 		按位异或^	:		两位一个为0一个为1,结果为1,否则为0(相同为0,不同为1)
 * 		按位取反~	:		0->1,1->0
 * 
 * 知识点3:算术右移>> 算术左移<< 逻辑右移>>>
 *      算术右移>>    :     低位溢出,符号位不变,并用符号位补溢出的高位
 *      算术左移<<    :     符号位不变,低位补0
 *      逻辑右移>>>   :     也称无符号右移,运算规则是:低位溢出,高位补0
 *      注:没有<<<符号
 * 
 * 编码:GBK
 * 
 *********************************************************************************/

public class BitOperator {
    public static void main(String[] args) {
        //练习1
        //1的原码/反码/补码:00000000 00000000 00000000 00000001
        //1>>2补码/反码/原码:00000000 00000000 00000000 00000000  即为0
        //本质是 1/2/2 = 0 (仅对正数)
        int a1 = 1>>2;
        //-1的原码:10000000 00000000 00000000 00000001
        //-1的反码:11111111 11111111 11111111 11111110
        //-1的补码:11111111 11111111 11111111 11111111
        //-1>>2的补码:11111111 11111111 11111111 11111111
        //-1>>2的反码:11111111 11111111 11111111 11111110
        //-1>>2的原码:10000000 00000000 00000000 00000001  即为-1
        int b1 = -1>>2;
        //1的原码/反码/补码:00000000 00000000 00000000 00000001
        //1<<2补码/反码/原码:00000000 00000000 00000000 00000100  即为4
        //本质是 1*2*2 = 4(仅对正数)
        int c1 = 1<<2;
        //-1的原码:10000000 00000000 00000000 00000001
        //-1的反码:11111111 11111111 11111111 11111110
        //-1的补码:11111111 11111111 11111111 11111111
        //-1<<2的补码:11111111 11111111 11111111 11111100
        //-1<<2的反码:11111111 11111111 11111111 11111011
        //-1<<2的原码:10000000 00000000 00000000 00000100  即为-4
        int d1 = -1<<2;
        //3的原码/反码/补码:00000000 00000000 00000000 00000011
        //3>>>2的补码/反码/原码为:000000000 00000000 00000000 00000000  即为0
        int e1 = 3>>>2;

        System.out.println("a1=" + a1);
        System.out.println("b1=" + b1);
        System.out.println("c1=" + c1);
        System.out.println("d1=" + d1);
        System.out.println("e1=" + e1);

        //练习2
        //2的原码/反码/补码:00000000 00000000 00000000 00000010
        //~2的补码:11111111 11111111 11111111 11111101
        //~2的反码:11111111 11111111 11111111 11111100
        //~2的原码:10000000 00000000 00000000 00000011  即为-3
        int a2 = ~2;
        //2的原码/反码/补码:00000000 00000000 00000000 00000010
        //3的原码/反码/补码:00000000 00000000 00000000 00000011
        //2&3的补码/反码/原码:00000000 00000000 00000000 00000010  即为2
        int b2 = 2&3;
        //2的原码/反码/补码:00000000 00000000 00000000 00000010
        //3的原码/反码/补码:00000000 00000000 00000000 00000011
        //2|3的补码/反码/原码:00000000 00000000 00000000 00000011  即为3       
        int c2 = 2|3;
        //5的原码/反码/补码:00000000 00000000 00000000 00000101
        //~5的补码:11111111 11111111 11111111 11111010
        //~5的反码:11111111 11111111 11111111 11111001
        //~5的原码:10000000 00000000 00000000 00000110  即为-6
        int d2 = ~5;
        //13的原码/反码/补码:00000000 00000000 00000000 00001101
        //7的原码/反码/补码:00000000 00000000 00000000 00000111
        //13&7的补码/反码/原码:00000000 00000000 00000000 000000101 即为5
        int e2 = 13&7;
        //5的原码/反码/补码:00000000 00000000 00000000 00000101
        //4的原码/反码/补码:00000000 00000000 00000000 00000100
        //5|4的补码/反码/原码:00000000 00000000 00000000 00000101 即为5
        int f2 = 5|4;
        //-3的原码:10000000 00000000 00000000 00000011
        //-3的反码:11111111 11111111 11111111 11111100
        //-3的补码:11111111 11111111 11111111 11111101
        //3的原码/反码/补码:00000000 00000000 00000000 00000011
        //-3^3的补码:11111111 11111111 11111111 11111110
        //-3^3的反码:11111111 11111111 11111111 11111101
        //-3^3的原码:10000000 00000000 00000000 00000010  即为-2
        int g2 = -3^3;
        
        System.out.println("a2=" + a2);
        System.out.println("b2=" + b2);
        System.out.println("c2=" + c2);
        System.out.println("d2=" + d2);
        System.out.println("e2=" + e2);
        System.out.println("f2=" + f2);
        System.out.println("g2=" + g2);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值