C++位运算符 (&、|、~、^)[**C++位运算符]
-
(https://blog.youkuaiyun.com/qq_42391248/article/details/84790152)
- 取反
| 或
& 与
^ 异或 参加运算的两个对象,对象位置不同(值不同),则该位为1。对应位置相同,则为0.
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
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++中的左移右移
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。
逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。
算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。
疑问
指针
-
什么是指针?
一般来说指针是一个其值为地址的变量,也就是说存储地址的变量。养成一个习惯,看到变量首先要想到这个变量存放一个地址,这个地址指向哪里。
-
两个基本的运算符:&(取址运算符)和(间接访问运算符/解引用指针)*
#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)