C语言中的位操作符

本文详细介绍了C/C++编程中的移位操作符(左移和右移)、位操作符(按位与、按位或、按位异或和按位取反)及其在交换变量和查找数组缺失整数问题中的应用。
摘要由CSDN通过智能技术生成

一.移位操作符:

注:移位操作符的操作数只能为整数,且不能为负数。

<<:左移操作符

移位规则:左边抛弃,右边补0。

                         

如图所示,我们发现,左移操作符就是把每个二进制位全部向左移动一位,相当于每个二进制位×2,所以原数也就变成了原来的两倍。

>>:右移操作符

右移操作符的运算有两种:

1.逻辑右移:左边用0填充,右边丢弃。

2.算数右移:左边用原该值的符号位填充,右边丢弃。

vs2022采用的便是算数右移,不妨给大家展示一下:

如图所示,根据输出结果得知,左边补的是符号位。

二.位操作符:&,|,^,~

1.按位与 &

规则:两个二进制操作数对应位同为1,结果位才为1, 其余情况均为0。 

2.按位或 |

规则:两个二进制操作数对应位只要有一个为1,结果位就为1, 同为0结果位才是0。

3.按位异或 ^

规则:两个二进制操作数对应位相同,结果位为0,相异结果位为1。

举两道很好的例题吧:

第一题:不能创建临时变量(第三个变量),实现两个数的交换。

#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d\n", a, b);
    return 0;
}

     

如图,我们就需要用到按位异或,

第一步(a=a^b)是将a^b赋值给了a;

第二步(b=a^b)中的a是a^b,所以a^b^b的值为a,就将a的值赋值给了b;

第三步(a=a^b)等号右边的a是a^b,等号右边的b此时为a,所以我们可以转换为a=a^b^a,于是就将b的值赋值给了a。

第二题:

数组nums包含从0n的所有整数,但其中缺了一个,请编写代码找出那个缺失的整数。

#include<stdio.h>
int main()
{
    int nums[] = { 1,9,8,5,6,7,2,3,0 };
    size_t numsSize = sizeof(nums) / sizeof(nums[0]);
    int n = 0;
    for (int i = 0; i < numsSize; i++)
    {
        n = n ^ nums[i];
    }
    for (int i = 0; i <= numsSize; i++)
    {
        n = n ^ i;
    }
    printf("消失的数字为%d\n", n);
    return 0;
}

这道题巧妙的运用了按位异或的规则,先用一个数按位与上nums数组的所有整数,然后再按位与上0到n的所有整数,剩下的那一个值便为缺失的数。

4.按位取反 ~

规则:将二进制操作数的每一位取反,二进制位为1,取反后就为0;二进制位为0,取反就为1。

以上便是本篇文章全部内容,制作不易,求三连。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值