云计算百科
云计算领域专业知识百科平台

C++位运算和操作符属性

移位操作符  >>   <<    下标引用操作符 【】   函数调用操作符()位操作符 & ^ |

二进制和进制转换    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 

* 乘 /  %                                                 结合性:从左到右

+ – 

<<    >>

<  <=

>  >=

==  !=

&   按位与

^   

|

&&

||

? :                                                 结合性:从右到左

=  +=  -=  *=  /=   %=  <<=  >>=  &=  ^=  |=        

,  逗号                                         结合性:从左到右

结合性:当相邻的操作符的优先级一样的时候,结合性说了算

() 由于圆括号的优先级最高,可以使用它改变其他运算符的优先级

赞(0)
未经允许不得转载:网硕互联帮助中心 » C++位运算和操作符属性
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!