• 深入理解位运算


    在这里插入图片描述

    什么是进制

    ​  进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制—X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

    ​  所以说运算的本质是什么呢?我觉得是查数。打破固有的思想,我们把每个数字都看成是符号,这样就有意思多了,我们可以写出自己的进制,可以做自己的运算

    进制转换

    1、其他进制转十进制

    从最低位开始,将每个位上的数提取出来,乘以进制的(位数-1)次方,求和

    // 2^n 二进制为:1{n个0}    2^n-1 二进制为:{n个1}
    二进制转十进制:	1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 11
    八进制转十进制:	0123 = 3*8^0 + 2*8^1 + 1*8^2 = 83
    十六进制转十进制:	0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 786
    
    • 1
    • 2
    • 3
    • 4

    2、十进制转其他进制

    将该数不断除以要转换的进制,知道商为0为止,然后将得到的余数倒过来

    十进制转二进制:	56 = 2^5 + 2^4 + 2^3 = 111000
    十进制转八进制:  156 = 0234
    十进制转十六进制:  256 = 0x164
    
    • 1
    • 2
    • 3

    3、二进制转其他进制

    将二进制数每三位一组(从低位开始组合),转成对应的八进制 十六进制时四位

    二进制转八进制: 11 010 101 = 0325
    二进制转十六进制: 1101 0101 = 0xD5
    
    • 1
    • 2

    4、其他进制转二进制

    将八进制/十六进制每一位转换成对应的一个3/4位的二进制数即可

    八进制转换成二进制:	0123 = 0 001 010 011 = 1010011
    十六进制转换成二进制:	0x156 = 0001 0101 0110 = 101010110
    
    • 1
    • 2

    原码、反码、补码

    • 对于有符号数而言:
      • 二进制的最高位是有符号位:0表示正数,1为负数
      • 正数的原码、反码、补码都一样
      • 0的反码、补码都是0
      • 负数的反码 = 它的原码符号位不变,其他位取反
      • 负数的补码 = 它的反码+1
      • 计算机运算的时候,都是以补码的方式运算的
    		1                  		     	 -1   
    原码 0000 0001						原码 1000 0001
    反码 0000 0001						反码 1111 1110
    补码 0000 0001						补码 1111 1111
    
    • 1
    • 2
    • 3
    • 4

    位运算符

    运算符描述规则
    &按位与同时为1,结果为1,否则为0
    |按位或有一个为1,结果为1,否则为0
    ^按位异或当结果不同时结果为1,否则为0
    <<左移左移N位就是乘以2的N次方
    >>左移右移N位就是除以2的N次方

    位运算本质

    只要是运算,都是补码!!!运算结束需要转换成源码

    //        2补码       3补码
    2 & 3 = 0000 0010 & 0000 0011 = 0000 0010 = 2
    2 | 3 = 0000 0010 | 0000 0011 = 0000 0011 = 3
    2 ^ 3 = 0000 0010 ^ 0000 0011 = 0000 0001 = 1
    
    //         -2补码      3补码      结果(补码)   -> 推出原码
    -2 & 3 = 1111 1110 & 0000 0011 = 0000010 =  2
    
    // 位移运算符 箭头朝向哪就是向哪个方向移
    // 右移:低位溢出符号位不变,并用符号位补溢出的高位
    // 左移:符号位不变,低位补0
    // 左移n位 = 原值 * 2^n			右移n位 = 原值 / 4
    1 >> 2 = 0  
    1 << 2 = 0000 0100 = 4 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ​  至此,位运算已经说明完毕。我们可以发现位运算的作用真的就只是在做标记而已,是名副其实的按位运算

  • 相关阅读:
    Yolov5进阶之八 高低版本格式转换问题
    实现页面图片滑块效果
    mysql基于SSM的自习室管理系统毕业设计源码201524
    linux:将进程切换到后台且不退出
    RabbitMQ详解-06RabbitMQ高级
    .NET 面向对象程序设计 —— 学习笔记 详细版
    Python自动化运维实战——Telnetlib和Netmiko自动化管理网络设备
    java高版本下各种JNDI Bypass方法复现
    网络安全管理与运维服务
    Linux1024一篇通俗易懂的liunx命令操作总结(第十课)
  • 原文地址:https://blog.csdn.net/weixin_45394086/article/details/125456271