数据结构与算法基础-二进制运算性质及相关算法

二进制运算性质及相关算法

  • 1 几个与码相关的术语
  • 2 位运算概述
  • 3 位运算符的运算率
    • 1. 交换律
    • 2. 结合律
    • 3. 等幂律
    • 4.零律
  • 4 位运算的高级操作
  • 5 位运算的应用

1 几个与码相关的术语

原码 : 以二进制形式在计算机中存储,数值前直接加一符号位的表示法 1表示负数 0 表示正数

反码 : 正数的反码与原码相同;负数的反码,符号位为 1 1 1,数值部分按位取反。

补码 : 正数的补码和原码相同;负数的补码则是符号位为 1 1 1,数值部分按位取反后再在末位(最低位)加 1 1 1,也就是反码 + 1 +1 +1

这里以数字7为例

int main()
{
       // 0111 1111  1111 1111  1111 1111 1111 1111
       //整数是以源码的形式存储 表示-10
       int num = 0x0000000A;
       cout << num << endl;
       // 负数是以补码的形式存储 -10的表示 补码是原码 按位取反加1
       num = ~(0x0000000A)+1;
       //cout << num << endl;
       int bitNum = 0x07;
       cout <<  bitNum << endl;// 7
       bitNum = (~bitNum) + 1;
       cout <<  bitNum << endl; // -7
      return 0;
}

2 位运算概述

符号 描述 运算规则
| 按位或 两位都是0时结果才是0
& 按位与 两位都是1时结果才是1
^ 按位异或 两位相同为 0 不同为 1
>> 右移 低位丢弃 高位补0
<< 左移 高位丢弃 低位补0

3 位运算符的运算率

1. 交换律

a a a ∣ | b b b ∣ | c c c = = = b b b ∣ | a a a ∣ | c c c

a a a ^ b b b ^ c c c = = = b b b ^ a a a ^ c c c

a a a & \& & b b b & \& & c c c = = = b b b & \& & a a a & \& & c c c

2. 结合律

a a a ∣ | b b b ∣ | c c c = = = a a a ∣ | ( b (b (b ∣ | c ) c) c)

a a a ^ b b b ^ c c c = = = b b b ^ ( a (a (a ^ c ) c) c)

a a a & \& & b b b & \& & c c c = = = b b b & \& & ( a (a (a & \& & c ) c) c)

3. 等幂律

A & A & A = A A \& A \& A = A A&A&A=A
A ∣ A ∣ A = A A | A | A = A AAA=A

4.零律

A   ˆ A = 0 A \^\ A = 0 A ˆA=0
A   ˆ 0 = A A \^\ 0 = A A ˆ0=A
A &   0 = 0 A \&\ 0 =0 A& 0=0

A ∣ 0 = A A|0=A A∣0=A
A ∧ 0 = A A∧ 0 = A A0=A

int main()
{
      cout << (3 | 2 | 4) << endl;
      cout << (2 | 3 | 4 ) << endl;

      cout << (3 & 2 & 4) << endl;
      cout << (2 & 3 & 4 ) << endl;

      cout << (2 ^ 3 ^ 4) << endl;
      cout << (3 ^ 2 ^ 4) << endl;

      cout << (10 & 10 & 10) << endl;

      cout << (10 | 10 | 10) << endl;

      cout << (10 ^ 10) << endl;
}

4 位运算的高级操作

功能 位运算
去掉最后一位 X >> 1
在最后加一个0 X << 1
在最后加一个1 X << 1 + 1
最后一位变1 X | 1
最后一位变0 X | 1 - 1
最后一位取反 X ^ 1
把右数第k位变为1 X ^ ( 1 << (k - 1))
把右数第k位变为1 X ^ ( 1 << (k - 1))
把右数第k位变为0 X & ~( 1 << (k - 1))
删除最右侧的1 X & (X-1)
取出最右侧的1 X & (-X)

5 位运算的应用

乘法/除法运算

int main()
{
    // 左移1位乘2 左移多少位就乘2的几次方
    // 右移1位除2 右移多少位就除2的几次方
     cout << (10 << 2) << " " <<   (100>>2) << endl;// 40 25
}


提取出最右侧的1

int main()
{
    // 一个 数与上自己的相反数得到此数最右侧的1
    cout << (7 & (-7)) << endl;
}


交换两个数的值

// a 和 b的内存地址不能是同一个 否则会被抹成0
void swap(int& a,int& b)
{
    a = a ^ b;
    b = a ^ b; // a ^ b ^ b a ^ 0 a
    a = a ^ b;
}

奇偶数判断

/**
  
 * @brief isEven
 * @param num
 * @return 
 */
bool isEven(int32 num)
{
   // 直接和1做与运算 为 0,则说明最后一位是0 否则为1
   return (num & 1) == 0 ? true : false;
}

二进制中1的个数

/**
 * @brief getBitCount
 * @param n
 * @return 
 */
int32 getBitCount(int32 n){
    int32 iCount = 0;
    while (n)
    {
       //
       n = n & (n - 1);
       ++iCount;
    }
    return iCount;
}

求绝对值

/**
 * @brief getReverse  取相反数
 * @param n
 * @return
 */
int32 getReverse(int32 n)
{
    return ~n + 1;
}

/**
 * @brief abs 取绝对值
 * @param n
 * @return
 */
int32 abs(int n)
{
    // 右移31位是为了得到符号位
    return ((n >> 31) == 0 )? n : (~n + 1);
}

你可能感兴趣的:(数据结构与算法,算法,c++,智能合约)