• 《Thinking in Java》位运算


    按位操作符:

    首先先记住一件事,方便理解:是否对应正负对应10.

    1.与(&):11得1,10得0,00得0.

    2.或(|):11得1,10得1,00得0.

    3.异或(^):11得0,10得1,00得0(相同为0,不同为1).

    4.(~):这是一元运算符,上面3个是2元运算符,0得1,1得0(取反)。

    移位操作符:

    记住:移位操作符左边的是整数类型(int)的被操作数,右边是要移动的位数。

    1.左位移操作符(<<):能按照操作符右侧指定的位数将操作符左边的操作数向移动(在低位补0,低位是右边,高位是左边)

    2.“有符号”右移位操作符(>>):按照操作符右侧指定的位数将操作符左边的操作数向右移动(“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号位负,则在高位插入1)。

    3.“无符号”右移位操作符(>>>):它使用“零扩展”:无论正负,都在高位插入0.

    4.左移操作符只有那么一种,不和右移位操作符一样。

    负数位运算:


    记住:int类型是8字节,32位的,高位的0是不显示的。而且最高位的1或者0代表的是正或者负,所以int类型表示的范围是:2的31次方-1至负的2的31次方(最高位是符号,所以只有31位代表数字,又因为正数里面有个0,所以是2的31次方要减1)。

    一个正整数的位运算就是按二进制转为32位的源码,高位的0不显示(Integer.toBinaryString(数字))

    以下代码以-6为例子,Integer.toBinaryString(-6)输出之后是(11111111  11111111  11111111  11111010)

    Integer.toBinaryString(6) = 110;

    1.转为源码:负数最高位为1,其他按其绝对值取(10000000  00000000  00000000  00000110)

    2.反码:最高位不变,其他位取反(11111111  11111111  11111111  11111001).

    3.补码:给反码进行+1操作(11111111  11111111  11111111  11111010)说明:最后的001代表的是1,1+1=2,所以最后三位应该是为2,2转为二进制是010

    重新转为10进制,只需按相反操作就行了:

    1.补码-1变反码

    2.反码:最高位不变,其他位取反变成源码

    3:源码按二进制转十进制计算

    即使是对负数进行位移操作,也只是在补码变反码之间加一个步骤,将补码位移变成新补码,再用新补码-1变反码

    负数位运算资料来源:https://blog.csdn.net/weixin_37322501/article/details/85759105

  • 相关阅读:
    在Linux上使用C语言编程获取IPv4地址及子网掩码
    使用gdb进行写操作
    [中英对照]The Art Of Reporting Bugs | 报bug的艺术
    [中英对照]Introduction to Remote Direct Memory Access (RDMA) | RDMA概述
    Intel万兆网卡背靠背连接ping不通那点事儿
    [中英对照]The sysfs Filesystem | sysfs文件系统
    图说单播,组播,广播,选播和地域播
    Ubuntu双网卡不双待攻略
    反汇编容易反编译难
    PHP之路——微信公众号授权获取用户信息
  • 原文地址:https://www.cnblogs.com/woyujiezhen/p/11488922.html
Copyright © 2020-2023  润新知