C语言位操作符

位操作符

在C语言中,位操作符包含以下六个:

  1. 按位非(取反) ~
  2. 按位与 &
  3. 按位或 |
  4. 按位异或 ^
  5. 左移 <<
  6. 右移 >>

        既然是位操作符,在操作之前就需要将操作的数转化为电脑所需要的二进制位再进行运算,这里要注意的是,位操作符只能应用于char、int、short、long这些类型。


按位非(取反) ~

        按位取反操作符是位操作符中唯一一个单目操作符,也是理解起来比较麻烦的操作符,所以放到第一位进行讲解,大家可以通过这个链接进行跳转。按位取反icon-default.png?t=M7J4https://blog.csdn.net/weixin_61787820/article/details/125685186?spm=1001.2014.3001.5501

        注意,要理解位操作符需要对原码、反码、补码有一定的了解(特别是负数,在位操作符的运算中都是以补码的形式参与的),而在按位取反的博客中对此有介绍和讲解,建议大家先行观看。

按位与 &

        简单来说,按位与 就是将两个数的二进制位进行逐一比较,1代表真,0代表假,按位与 需要两个数的相同位置都为真才能得到真,其余情况都为假。

#include <stdio.h>

int main()
{
    int a = -1;//11111111111111111111111111111111(补码)
    int b = -2;//11111111111111111111111111111110(补码)
    int c = a & b;//11111111111111111111111111111110 (补码)(都是真才真)
    printf("%d", c);//-2
    return 0;
}

 按位或 |

        按位或 和 按位与 相似,将两个数的二进制位进行逐一比较,1代表真,0代表假,按位或 仅需要两个数的相同位置有一个为真就能得到真,其余情况为假。

#include <stdio.h>

int main()
{
	int a = -1;//11111111111111111111111111111111(补码)
	int b = -2;//11111111111111111111111111111110(补码)
	int c = a | b;//11111111111111111111111111111111 (补码)(一真就真)
	printf("%d", c);//-1
	return 0;
}

按位异或 ^

按位异或稍微特殊,将两个数的二进制位进行逐一比较,相同为0,不相同为1.

#include <stdio.h>

int main()
{
	int a = -1;//11111111111111111111111111111111(补码)
	int b = -2;//11111111111111111111111111111110(补码)
	int c = a ^ b;//00000000000000000000000000000001 (补码)
	printf("%d", c);//1
	return 0;
}

左移 <<

        左移是对二进制位进行移动,例如1的二进制位为00000000000000000000000000000001,

左移一位后,1到了倒数第二位,末位补0,即00000000000000000000000000000010.

右移 >>

右移相对特殊,不同的编译器有不同的情况,具体分为两种:

#include <stdio.h>

int main()
{
    int a = -1;//11111111111111111111111111111111
    int b = a >> 1;//二进制右移(注意有两种情况)
    //算术右移
    printf("%d", b);//符号位补原本符号 11111111111111111111111111111111
    //逻辑右移
    printf("%d", b);//符号位补0 01111111111111111111111111111111(正数原码、反码、补码相同)
    return 0;
}

大家可以运行以下判断自己的编译器属于哪一种。


总结

        位操作符的应用范围和一般的操作符相比较小,但是也是有独特的作用的,例如可以用于简单的密码加密;在不创建变量的情况下安全的交换两个数等等,更重要的是,它能帮助我们加深对电脑的理解。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dak2n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值