C基础知识

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,低位溢出
      对有符号数来说,高位补符号位,低位溢出。
 




















 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值