移位操作符 >> << 下标引用操作符 【】 函数调用操作符()位操作符 & ^ |
二进制和进制转换 0x123 — 16进制数字 以0x开头 017 — 8进制数字 以0开头
10进制满10 近1 ,是由0–9组成的数字
2进制满2近1 ,是由0–1组成的数字
8进制的数字每一位是 0 — 7 中的数字,
2进制转换成8进制的数字,从2进制序列最低位开始从右向左每 3 个 2 进制会换算成 1个 8 进制位,剩余不够3个2进制位就直接换算
8进制转换成2进制,每一个8进制位转换成3个2进制位就行
2进制转换成16进制,从右向左每4位就转换一次,剩余不够4个二进制位的直接换算
16进制转换成2进制,16进制的每一位转换成3个2进制位
2,8,16进制转换成10进制,分别是从2的0次方,8的0次方,10的0次方开始 。每一位次方后再乘以他们的进制位上的数字,最后求和
10进制转2进制 ,将要转换的数字除以 2后的余数从下往上依此所得的数就是2进制数
原码、反码、补码
有符号整数的原码、反码、补码的二进制表示中均由 符号位 和 数值位 两部分组成,2进制序列中,最高的1位是被当作符号位,剩余的位数值位,符号位都是用0或1表示的,0表示 正,1 表示负。正整数的原码、反码、补码 相同。但是 负数 则不同
负数时:
原码:直接将数值按照正负数的形式翻译成2进制得到的就是原码
反码:原码的符号位不变,其他位依此按位取反就可以得到反码
补码:反码+1就得到补码
原码 取反 + 1 得到补码
int a = 10;
00000000 00000000 00000000 00001010 原码
00000000 00000000 00000000 00001010 反码
00000000 00000000 00000000 00001010 补码
int a = -10;
10000000 00000000 00000000 00001010 原码
11111111 11111111 11111111 11110101 反码
11111111 11111111 11111111 111110110 补码
对于无符号整数的三种2进制表示相同,没有符号位每一位都是数值位
整数在内存中是以补码的形式存储的,整数在参与位运算时,也是使用内存中的补码进行计算的,计算的结果也是补码,需要转换成原码才是真实值
<< 左移操作符 >> 右移操作符 & 按位与操作符 | 按位或操作符 ^ 按位异或操作符 ~ 按位取反操作符
移位操作符,移动的是存储在内存中的补码的二进制序列
移位规则:<< 表示左边抛弃,右边补0
int num = 10;
int n = num;
num = num << 1;
cout << "n = " << n << endl;
00000000 000000000 00000000 00001010
cout << "num = " << num << endl;
00000000 000000000 00000000 00010100 移位后num是不会变的,n会变
num = num << 1; 表示num向左移动1位后赋值给num
左移一位有 乘2 的效果(一般针对的是整数 和 无符号的数)
>> 右移 分为中情况 逻辑右移 和 算数右移 采用哪种方式取决于编译器,大部分采用算数右移
逻辑右移:左边用0补充,右边丢弃
算数右移:左边用原该值的符号位填充,右边丢弃
对于正数向右移1位有除2的效果
对于移位置来说,不要移动负数位
& 按位与 指的是二进制的形式 并且是补码的形式
& 按位与 规则:对2个数的对应2进制位进行与运算,只有对应的两个2进制位都为1时,结果才为1(同时为1才为1,只要有0就为0)
| 按位或 对应的2进制位进行或的计算(只要有1就是1,同时为0才为0)
^ 按位异或 对应的2进制位进行或的计算(相同为0,相异为1)
~ 按位取反 2进制0变1,1变0
偶数的2进制最低位都是0,奇数的最低为位1
(x & 1) == 0 说明 x 是 偶数
(x & 1) == 1 说明 x 是 奇数
保留2进制位中的指定位:这个时候可以使用一个值m,使m的2进制中对应出的位置为1,其他位为0,然后使这两个数按位与即可。如果要保留后面几位,如果是4位的话,就将m的后面4位设置为1 其他位设置为0,再与2进制中的数进行 按位与 运算
获取2进制中的指定位:当我们要获取一个整数x的2进制中的第i位(从低到高,以最低为为第0位)是1还是0的时候,对x进行这样的计算(x >> i)&1,如果结果是0,表示第i位是0,如果是1,就表示第i位是1
将指定2进制位设置为1,其余位保留原值:使用数m,使m的2进制上对应位置为1,其余位置为0,然后使2个数进行按位或运算(x | m),即可得到想要的数
将指定2进制位设置位0:x & ~(1 << i)
反转指定2进制位:x ^ m,可以使用一个数m,使得m的2进制中第i位为1,其余位为0,然后进行异或运算
将2进制中最右边的1变为0:x &(x – 1) 这种运算通常运用到一个2进制序列中有几个1。 如果将 x = x & (x – 1)的到的值再赋给 x,其实x的2进制序列中的1就会少1个,进行一次少一个,进行多次直到x中的1完全没有后,就可以得到x中有几个1
只要是2的几次方的数,它的2进制序列中只有一个1,可以用判断序列中有几个1 来判断 这个数是否是2的次方数,用公式 x &(x – 1)表达式的结果是0就是
只保留2进制中最右边的1:x & -x 就可以得到 就是x与 -x二进制中的补码 进行按位与 运算即可。由于只要是2的几次方的数,它的2进制序列中只有一个1,那么(x & (-x)) == x 时 x 与 -x 相等时也能判断这个数是否为2的次方数
异或的巧用: x ^ x = 0 两个相同的数字异或结果是0, 0 ^ x = x 0和x异或还是x, a ^ b ^ a == a ^ a ^ b 异或是支持交换律的
使用异或交换两个整数的值
num 数组中提供了数据
numsize 就表示数组的元素个数
操作符的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序
优先级:如果一个表达式中包含多个运算符,那个运算符应该优先执行。各种运算符的优先级是不一样的。 注意:相邻的操作符才区别优先级 优先级高的先算。
优先级由高到低为:
++ — 后置比前置优先级高 结合性:从左到右
()
[ ]
.
->
(type){list}
++ — 结合性:从右到左
! ~
(type)
* 解引用
& 取地址
sizeof
_Alignof
* 乘 / % 结合性:从左到右
+ –
<< >>
< <=
> >=
== !=
& 按位与
^
|
&&
||
? : 结合性:从右到左
= += -= *= /= %= <<= >>= &= ^= |=
, 逗号 结合性:从左到右
结合性:当相邻的操作符的优先级一样的时候,结合性说了算
() 由于圆括号的优先级最高,可以使用它改变其他运算符的优先级
网硕互联帮助中心






评论前必须登录!
注册