C/C++运算符

本文深入解析C++中的位运算符,通过实例演示位运算的使用,包括按位与、或、异或、取反及左移右移操作。同时,文章提供了二进制分析,帮助理解位运算在实际代码中的应用。

前言

前几天在看《STL源码剖析》时看到一段这样的代码 return ( (bytes) + __ALIGN - 1) & ~ (ALIGN -1)); //将 bytes 上调至 8 的倍数。虽然有注解,但当时对着这段代码真的是半天没有反应过来。直觉告诉我应该看看 C/C++ 的运算符了,这里主要复习位运算符的知识,其他的运算符,可以敲代码试一试。

其实有一些系统的源码会用到位运算,看这些源码的时候,要对 C++ 中的运算符比较熟,最起码要知道每一个运算符的含义才能看懂代码。例如下面的代码是一些位运算,其中就用到了这类知识。

int32_t Func::set_bit(int32_t& data, int32_t index){
    return (data |= (1 << index));   // 1 左移 index 位后与 data 或
}

int32_t Func::clr_bit(int32_t& data, int32_t index){
    return (data &= ~(1 << index));  // 将设置的 1 清除, ~ 的效果是翻转位,即 0 变成 1, 1 变成 0。
}

int32_t Func::test_bit(int32_t data, int32_t index){
    return (data & (1 << index));    // 判断该位是不是 1     
}

 

算数运算符

 

关系运算符

 

逻辑运算符

 

位运算符

代码如下:

#include <iostream>
using namespace std;

int main()
{
    int A = 60, B = 13;
    cout << "A&B: " << (A & B) << endl;
    cout << "A|B: " << (A | B) << endl;
    cout << "A^B: " << (A ^ B) << endl;
    cout << "~A:  " << ~A << endl;
    cout << "A<<2:  " << (A<<2) << endl;
    cout << "A>>2:  " << (A>>2) << endl;
    return 0;
}

转化为二进制分析:

十进制:A = 60, B = 13
二进制:A = 0011 1100
二进制:B = 0000 1101

     A&B = 0000 1100 
     A|B = 0011 1101
     A^B = 0011 0001   //异或,相同为0,不同为1
      ~A = 1100 0011   //取反

现在再看看《STL源码剖析》中的 return ( (bytes) + __ALIGN - 1) & ~ (ALIGN -1));  //  有定义enum { __ALIGN = 8 };

这里将代码分成两部分 [(bytes) + __ALIGN - 1)] & [~(ALIGN -1)]

其中bytes是我们输入的值

当我们输入的bytes = 13时,先将和20转化成二进制:10100   //占5位
7的二进制为:00111   所以~(7):11000

20     10100
~(7)   11000
&
16     10000     //结果是16

 

赋值运算符

 

其他运算符

 

运算符优先级

 

图片来自:http://www.runoob.com/cplusplus/cpp-operators.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tyler_Zx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值