按位操作符:按位与 & 、按位或 | 、按位异或 ^ 、按位取反 ~

简介: 所有的按位操作符都是按二进制位补码操作

一、说明


所有的按位操作符都是按二进制位补码操作


二、按位与 &


有0则为0,全1才是1


例如 3&-5


3的补码:  0000 0000 0000 0000 0000 0000 0000 0011


-5的补码: 1111  1111 1111  1111  1111 1111  1111  1011


3&-5:0000 0000 0000 0000 0000 0000 0000 0011


转换为原码:0000 0000 0000 0000 0000 0000 0000 0011


结果:3


int main()
{
    printf("%d", 3 & -5);
    return 0;
}

三、按位或 |


全0才是0,有1则为1


例如 3 | -5


3的补码:  0000 0000 0000 0000 0000 0000 0000 0011


-5的补码: 1111  1111 1111  1111  1111 1111  1111  1011


3&-5:1111  1111 1111  1111  1111 1111  1111 1011


转换为原码:1000 0000 0000 0000 0000 0000 0000 0101


结果:-5

int main()
{
    printf("%d", 3 | -5);
    return 0;
}

四、按位异或 ^


相同为0,相异为1


例如 3 ^ -5


3的补码:  0000 0000 0000 0000 0000 0000 0000 0011


-5的补码: 1111  1111 1111  1111  1111 1111  1111  1011


3&-5:1111  1111 1111  1111  1111 1111  1111 1000


转换为原码:1000 0000 0000 0000 0000 0000 0000 1000


结果:-8

int main()
{
    printf("%d", 3 ^ -5);
    return 0;
}

五、按位取反 ~


二进制位补码全部取反,包括符号位


例如 ~3


3的补码:  0000 0000 0000 0000 0000 0000 0000 0011


~3:1111  1111 1111  1111  1111 1111  1111 1100


转换为原码:1000 0000 0000 0000 0000 0000 0000 0100


结果:-4

int main()
{
    printf("%d", ~3);
    return 0;
}

六、按位与 & 的实用技巧

任何数字的按位与 1 都可以得到其二进制位原码的最低位

原理:

1的二进制位补码为 0000 0000 0000 0000 0000 0000 0000 0001

数字n的补码最低位和原码最低位是相同的,所以按位与之后得到的补码前31位都是0,最后一位如果是0得到0,如果是1得到1。补码转原码最低位不变,因此可以得到数字n原码的最低位。

目录
相关文章
|
5月前
学习使用按位异或 ^
学习使用按位异或 ^。
53 9
|
9月前
|
Python
位运算符
【6月更文挑战第28天】位运算符。
46 1
|
9月前
|
存储 编译器 C++
C++中的位运算符
C++中的位运算符
51 0
|
C语言
C/运算符(按位与、按位或、按位异或)
C/运算符(按位与、按位或、按位异或)
^(按位异或)操作符详解
^(按位异或)操作符详解
异或运算符简单逻辑运算 a^=b
异或运算符简单逻辑运算 a^=b
151 0
|
算法
异或^符号的使用
异或^符号的使用
139 0
位运算中的按位与(&),按位或(|),按位异或(^)
位运算中的按位与(&),按位或(|),按位异或(^)
184 0
位运算中的按位与(&),按位或(|),按位异或(^)
(位操作符)按位与、按位或、按位异或
(位操作符)按位与、按位或、按位异或
(位操作符)按位与、按位或、按位异或