• 算法:【位运算】详解、总结、具体推导过程


    目录

    规则总结:

    举例说明(含推导)

    1.         ~、&、|、^  部分

    2. >> 、<< 、>>> 部分(注意没有<<<)

    补充:快速算法


    规则总结:


    ​​
    *     ① 二进制的最高位是符号位:0正1负
    *     ② 正数的原码、反码、补码都一样(三码合一
    *     ③ 负数的反码 = 原码的符号位不变,其他位取反(0->1、1->0)
    *     ④ 负数的补码 = 负数的反码 + 1  ,负数的反码 = 负数的补码 - 1
    *     ⑤ 0 的反码、补码都是 0
    *
    *     ⑥ java都是带符号运算,所以 最高位是0就是正、最高位是1就是负
    *     ⑦ 计算机运算都是 以补码的方式进行运算
    *     ⑧ 我们看到的结果都是原码
    *
    *  >>、<< 和 >>> 的规则:
    *     ① 算数右移 >> :低位溢出,符号位不变,并用符号位补溢出的高位
    *     ② 算数左移 << :符号位不变,低位补0
    *     ③ >>> 逻辑右移:也叫无符号右移,低位溢出,高位补0
    *     ④ 没有 <<< !!!
    *
    *     补充个模的公式: a % b = a - (int)a/b *b
    *     注意:有小数运算,等得的结果是近似值(对结果进行==判断时,要小心注意)
    *     -10.5 % 3 = -10.5 - (-10)/3*3 = -10.5 - (-9) = -1.5

    举例说明(含推导)

    1.         ~、&、|、^  部分

    1. // 例题一:~2 = ? 按位取反
    2. // 2 的原码(2进制)= 反码 = 补码: 0000 0000 0000 0010
    3. // 取反(=补码),因为是负数,所以要继续转 : 1111 1111 1111 1101
    4. // 转反码(-1): 1111 1111 1111 1100
    5. // 转回到原码 : 1000 0000 0000 0011
    6. System.out.println(~2); //-3
    7. // 例题二:2&3 = ? 2按位与3
    8. // 2的原码 = 反码 = 补码: 0000 0000 0000 0010
    9. // 3的原码 = 反码 = 补码: 0000 0000 0000 0011
    10. // 2的补码 & 3的补码 = 补码(正数:三码合一) = 原码 0000 0000 0000 0010
    11. System.out.println(2&3); //2
    12. //例题三:2|3 = ? 2按位或3
    13. // 2的原码 = 反码 = 补码: 0000 0000 0000 0010
    14. // 3的原码 = 反码 = 补码: 0000 0000 0000 0011
    15. // 2的补码 | 3的补码 = 补码(正数:三码合一) = 原码 0000 0000 0000 0011
    16. System.out.println(2|3); //3
    17. //例题四:~-5 = ? 按位取反
    18. // -5 的原码(2进制): 1000 0000 0000 0101
    19. // -5 的反码(2进制): 1111 1111 1111 1010
    20. // -5 的补码(-1): 1111 1111 1111 1011
    21. // 取反(=补码),因为是负数,所以要继续转 : 0000 0000 0000 0100
    22. System.out.println(~-5); //4
    23. //例题五:13&7 = ? 13按位与7
    24. // 13的原码 = 反码 = 补码: 0000 0000 0000 1101
    25. // 7的原码 = 反码 = 补码: 0000 0000 0000 0111
    26. // 13的补码 & 7的补码 =补码(正数:三码合一) = 原码 0000 0000 0000 0101
    27. System.out.println(13&7); //5
    28. //例题六:5|4 = ? 5按位或4
    29. // 5的原码 = 反码 = 补码: 0000 0000 0000 0101
    30. // 4的原码 = 反码 = 补码: 0000 0000 0000 0100
    31. // 13的补码 | 7的补码 =补码(正数:三码合一) = 原码 0000 0000 0000 0101
    32. System.out.println(5|4); //5
    33. //例题七:-3^3 = ? -3按位异或3
    34. // -3的原码: 10000000 00000000 00000000 00000011
    35. // -3的反码: 11111111 11111111 11111111 11111100
    36. // -3的补码(+1) 11111111 11111111 11111111 11111101
    37. // 3的原码 = 反码 = 补码 00000000 00000000 00000000 00000011
    38. // -3的补码 ^ 3的补码 11111111 11111111 11111111 11111110
    39. // 转反码(-1) 11111111 11111111 11111111 11111101
    40. // 转原码(结果): 10000000 00000000 00000000 00000010
    41. System.out.println(-3^3); //-2

    2. >> 、<< 、>>> 部分(注意没有<<<)

    1. //例题八:1>>2
    2. //1的原码 = 反码 = 补码: 00000000 00000000 00000000 00000001
    3. //右移2位 00000000 00000000 00000000 00000000
    4. System.out.println(1>>2); //0
    5. //例题九:-1>>2
    6. //1的原码: 10000000 00000000 00000000 00000001
    7. //反码: 11111111 11111111 11111111 11111110
    8. //补码(+1): 11111111 11111111 11111111 11111111
    9. //右移2位(补码): 11111111 11111111 11111111 11111111
    10. //转反码(-1): 11111111 11111111 11111111 11111110
    11. //转原码: 10000000 00000000 00000000 00000001
    12. System.out.println(-1>>2); //-1
    13. //例题十:1<<2
    14. //1的原码 = 反码 = 补码: 00000000 00000000 00000000 00000001
    15. //左移2位 00000000 00000000 00000000 00000100
    16. System.out.println(1<<2); //4 1*2*2(快速算法)
    17. //例题十一:-1<<2
    18. //1的原码: 10000000 00000000 00000000 00000001
    19. //反码: 11111111 11111111 11111111 11111110
    20. //补码(+1): 11111111 11111111 11111111 11111111
    21. //左移2位 11111111 11111111 11111111 11111100
    22. //转反码(-1): 11111111 11111111 11111111 11111011
    23. //转原码: 10000000 00000000 00000000 00000100
    24. System.out.println(-1<<2); //-4
    25. //例题十二:3>>>1
    26. //3的原码 = 反码 = 补码 : 00000000 00000000 00000000 00000011
    27. //3无符号右移1: 00000000 00000000 00000000 00000001
    28. System.out.println(3>>>1); //0
    29. //例题十三:-3>>>1
    30. //-3的原码: 10000000 00000000 00000000 00000011
    31. //-3的反码: 11111111 11111111 11111111 11111100
    32. //-3的补码(+1): 11111111 11111111 11111111 11111101
    33. //-3的补码无符号右移1: 01111111 11111111 11111111 11111110
    34. System.out.println(-3>>>1); //2,147,483,646

    补充:快速算法

         a<

         a>>b :相当于 a*2的-b次方 (a/2/2/2... 除了b个 2)

    1. //快速算法:
    2. System.out.println(4<<3); // 4*2*2*2=32
    3. System.out.println(16>>2); // 16/2/2 = 4

  • 相关阅读:
    net心理健康咨询毕业设计-附源码010259
    分布式与微服务概念
    数字人IP为何成家电品牌年轻化营销黑马?
    【模板】MST最小生成树(Prim算法、Krustra算法)
    初次接触Sharding-JDBC并实际应用
    C++入门知识
    Rest和Http什么关系?
    对抗攻击方法一览
    易仓科技×OceanBase:打造跨境行业全生态链的新零售SaaS
    Mysql 面试题总结
  • 原文地址:https://blog.csdn.net/Mouth_OF_Lie/article/details/127631970