美文网首页C/C++学习笔录
简单介绍一下位运算符

简单介绍一下位运算符

作者: Allen_HD | 来源:发表于2019-04-19 17:54 被阅读0次

    <font size = 4>首先强调一下 <font color=red>二进制数在内存中以补码的形式存在</font>(可能我自己的知识点匮乏)</font>

    二进制就不简单说了,先介绍一下原码、反码、补码的知识点
    <font color = gray size =3>
    对于有符号数而言

    • 二进制的最高位是符号为:0为正,1为负
    • <font color = red>正数的原码、反码、补码都是一样的。</font>
    • 负数的反码 = 原码符号位不变,其他位取反(0变1,1变0)
    • 负数的补码 = 反码 + 1;
    • <font color = red>负数的原码 = 反码取反</font>
    • <font color = red>负数的原码 = 补码取反 + 1</font>
    • 0的反码、补码都为0
    • <font color = red>在计算机运行的时候,都是以补码的方式来运行的</font>
      </font>
      // 由于计算机数字是32位,这里举例暂用8位

    下面来介绍一下位取反 (~)

    // 我们对 11进行取反 (~11)
    // 11 在计算机中储存是它的补码(正数原码、补码都一样)
    // 0000 1011   (11的原码)
    // 0000 1011   (11的补码)
    // 1111 0100   (按位取反)  (这里得到的是内存中储存的二进制,即 原数的补码)
    // 接下来将补码转变成原码(符号位不变,减一取反)
    // 1000 1100   ( == -12)   
    

    有个小规律:<font color = greed>位运算符(~)—— 数字求负数,然后减一 (-number -1)</font>

    位运算符 与 (&)

    /*
    每一位与的规律:
    0  0   0
    0  1   0
    1  0   0
    1  1   1   
    */
    // 来试试  25 & 3
    // 0001 1001    // 25的补码  由于正数,原、补、反码都一样
    // 0000 0011    // 3的补码
    // 0000 0001    // 25 & 3 =  1
    
    // 看看负数 -25 & -3
    // 1001 1001    // -25的原码
    // 1000 0011    // -3的原码
    // 1110 0111    // -25的补码
    // 1111 1101    // -3的补码
    // 1110 0101    // -25 & -3的补码
    // 1001 1011    // -25 & -3的原码 = -27         
    

    位运算符 或 (|)

    /*
    每一位与的规律:
    0  0   0
    0  1   1
    1  0   1
    1  1   1   
    */
    // 来试试  25 | 3
    // 0001 1001    // 25的补码  由于正数,原、补、反码都一样
    // 0000 0011    // 3的补码
    // 0001 1011    // 25 | 3 =  27
    
    // 看看负数 -25 | -3
    // 1001 1001    // -25的原码
    // 1000 0011    // -3的原码
    // 1110 0111    // -25的补码
    // 1111 1101    // -3的补码
    // 1111 1111    // -25 | -3的补码
    // 1000 0001    // -25 | -3的原码 = -1        
    

    位运算符 异或 (^)

    /*
    每一位与的规律:
    0  0   0
    0  1   1
    1  0   1
    1  1   0   
    */
    // 来试试  25 ^ 3
    // 0001 1001    // 25的补码  由于正数,原、补、反码都一样
    // 0000 0011    // 3的补码
    // 0001 1010    // 25 ^ 3 =  26
    
    // 看看负数 -25 ^ -3
    // 1001 1001    // -25的原码
    // 1000 0011    // -3的原码
    // 1110 0111    // -25的补码
    // 1111 1101    // -3的补码
    // 0001 1010    // -25 ^ -3的补码 (正数 也是 -25 ^ 3 的原码)      
    

    位运算符 左移 (<<)
    // 整体向往左移动,用<font color = red>0</font>补齐,符号位不变

    // 来试试  25 << 2
    // 0001 1001    // 25
    // 0110 0100    // 25 << 2  == 100
    
    // 来试试  -25 << 2
    // 1001 1001    // -25
    // 1110 0100    // -25 << 2  == -100
    

    位运算符 右移 (>>)
    // 整体向往右移动,用 <font color = red>符号位</font> 补齐,符号位不变

    // 来试试  25 >> 2
    // 0001 1001    // 25
    // 0000 0110   // 25 >> 2  == 6  //符号位为0 补齐
    
    // 来试试  -25 >> 2
    // 1001 1001    // -25
    // 1110 0111    // -25的补码
    // 1111 1001  // -25 >> 2的补码
    // 1000 0111  //-25 >> 2 的原码 == -7
    

    相关文章

      网友评论

        本文标题:简单介绍一下位运算符

        本文链接:https://www.haomeiwen.com/subject/bbucgqtx.html