简单介绍一下位运算符

首先强调一下 二进制数在内存中以补码的形式存在(可能我自己的知识点匮乏)

二进制就不简单说了,先介绍一下原码、反码、补码的知识点

对于有符号数而言

  • 二进制的最高位是符号为:0为正,1为负
  • 正数的原码、反码、补码都是一样的。
  • 负数的反码 = 原码符号位不变,其他位取反(0变1,1变0)
  • 负数的补码 = 反码 + 1;
  • 负数的原码 = 反码取反
  • 负数的原码 = 补码取反 + 1
  • 0的反码、补码都为0
  • 在计算机运行的时候,都是以补码的方式来运行的

    // 由于计算机数字是32位,这里举例暂用8位

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

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

有个小规律:位运算符(~)—— 数字求负数,然后减一 (-number -1

位运算符 与 (&)

/*
每一位与的规律:
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 的原码)      

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

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

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

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

// 来试试  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

你可能感兴趣的:(简单介绍一下位运算符)