a *= 6+8; // a = a*(6+8);
1. &按位 与 任何值与0得0, 与1保持不变(一般使用在位清零)
使某位清0
0101 1011 &
1011 0100 =
----------------------
0001 0000
A = 17 & 0xf0 1111 0000
* * * * * * * * &
0101 0101
--------------------------------
0* 0* 0* 0*
2. | 按位 或(一般是用在置1)
任何值或1得1,或0保持不变
将指定位置1
0101 0011 |
1011 0100 =
--------------------------
1111 0111
* * * * * * * *
1010 1010
-----------------------------
1* 1* 1* 1*
3. ~ 按位取反
1变0, 0变1
0101 1101 ~ =
------------------------
1010 0010
4. ^ 按位异或
相异得1,相同得0 定位翻转
1001 1100 ^
0101 1010 =
--------------------------
1100 0110
5.位移
>> 右移(注意右移分为:逻辑右移、算数右移)区别于编译器
<< 左移
(1).左移<<高位溢出,地位补0
0101 1010 << 3
-------------------------------
1101 0000
(2).右移
①逻辑右移 高位补0,地位溢出
0101 0101 >> 3
-------------------------
0000 1010
②算数右移:
对有符号数 低位溢出、高位补符号位
1010 1010 >> 3 负数算数右移动3位
---------------------------
1111 0101
-1
1000 0000 0000 0000 0000 0000 0000 0001 源码
1111 1111 1111 1111 1111 1111 1111 1110 反码
1111 1111 1111 1111 1111 1111 1111 1111 补码
printf("%d\n", -1>>3); gcc为算数右移
如果结果还是-1 证明为算数右移
===================================================
0101 0101 >> 3 正数算数右移3位
----------------------------------------
0000 1010
对无符号数 低位溢出,高位补0
1010 1010 >> 3
-------------------------------
0001 0101
总结:右移
1.逻辑右移 高位补0,地位溢出 注:无论是有符号数还是无符号数都是高位补0,低位溢出
2.算数右移 高位补符号位,低位溢出(有符号数) gcc
注:对无符号数来说。高位补0,低位溢出
对有符号数来说,高位补符号位,低位溢出。