c++ 补码 位运算 指针

本文深入探讨C++中的位运算符(&、|、~、^)及其应用,解析原码、反码、补码的概念。同时,详细介绍了指针的基本概念,包括如何声明、使用以及与数组的关系,帮助读者全面掌握C++位操作和指针使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++位运算符 (&、|、~、^)[**C++位运算符]

(https://blog.youkuaiyun.com/qq_42391248/article/details/84790152)
取反

| 或

& 与

^ 异或 参加运算的两个对象,对象位置不同(值不同),则该位为1。对应位置相同,则为0.

pqp & qp | qp ^ q
00000
01011
11110
10011

C++ 原码、反码、补码

原码, 反码, 补码

  • 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
  • 反码 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
  • 补码 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

将钟表想象成是一个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 需要怎么做呢?我们可以:

\1. 往回拨2个小时: 6 - 2 = 4

\2. 往前拨10个小时: (6 + 10) mod 12 = 4

\3. 往前拨10+12=22个小时: (6+22) mod 12 =4

2,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12后的余数是4.

所以钟表往回拨(减法)的结果可以用往前拨(加法)替代!

  • 负数取模

    x mod y等于 x 减去 y 乘上 x与y的商的下界.

    以 -3 mod 2 举例:

    -3 mod 2

    = -3 - 2xL -3/2 J

    = -3 - 2xL-1.5J

    = -3 - 2x(-2)

    = -3 + 4 = 1

c++中的左移右移

c++中的左移右移

移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。

逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。

算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。

疑问

位操作奇技淫巧之原理加实践

指针

深度长文教你彻底掌握C++/C指针(一)基石

  • 什么是指针?

    一般来说指针是一个其值为地址的变量,也就是说存储地址的变量。养成一个习惯,看到变量首先要想到这个变量存放一个地址,这个地址指向哪里。

  • 两个基本的运算符:&(取址运算符)(间接访问运算符/解引用指针)*

    #include<iostream>
    using namespace std;
    int main()
    {
        int a = 5;
        cout<<"a:"<<&a<<endl;
        return 0;
    }
    //输出
    //地址 a:Oxxxxxx
    

    对于*运算符,就是后面跟着一个指向地址的指针的时候,得到的是这个地址中的内容。

    #include<iostream>
    using namespace std;
    int main()
    {
        int a =5;
        // &a是指向的一个地址
        //*(&a)是指向这个地址的内容
        cout<<"a:"<<*(&a)<<endl;
    }
    //输出 
    //a 5
    
  • 指针的模板

    指向地址的数据类型 * 指针变量名;

    举一个例子进一步来理解上面那个的含义.比如我想创建一个指针变量(存放地址的变量),这个指针(地址)是指向一个存储整形的内存.那么我就可以写为:int * leo;同理,指向char的我可以写成char * c;其实是很简单的.

    #include <iostream>
    using namespace std;
    int main()
    {
      int a=5,b=6,c=7,d=8;
      double e=3.1415;
      //单独赋值,并且*和p_a紧挨着
      int *p_a=&a;
      //多个赋值(既有指针,又有普通变量)
      int * p_b=&b,* p_c=&c,*p_d=&d,temp=100;
    
      //单独赋值,double类型
      double * p_e=&e;
    
      cout<<p_a<<endl<<p_b<<endl<<p_c<<endl<<p_d<<endl<<p_e<<endl;
      cout<<temp<<endl;
    }
    //输出
    0Xxxxxx
    0xxxxxx
    0xxxxxx
    0xxxxxx
    0xxxxxx
    100
    

    怎么说呢,其实多看看代码吧。比较好理解

深度长文教你彻底掌握C++/C指针(二):指针与数组和字符串

其实这里我有点看的似懂非懂

- 指针与数组

说到指针和数组,这里直接说三个最基本的规则,这三个规则基本上能够概括指针和数组的常见关系了.

一看到数组,就要知道数组名可以当做这个数组的第一个地址。(a=&a[0])
对于指向数组的指针,指针+n表示往后移动n个位置
指针也可以像数组那样用p_a[n]这种形式直接取元素,本质是*(p_a+n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值