C语言菜鸟学习(位运算)

位运算

位运算符是指按bit位来进行的运算。

注意:所有位运算都需要把操作数变成bit序列,然后再按bit位来运算 ​ 位运算符要求操作数是

位运算符

运算符名称举例功能说明
~位反~a将变量 a 中的每一位取反
&位与a & b将变量 a 和 b 逐位进行与操作
|位或a | b将变量 a 和 b 逐位进行或操作
^位异或a ^ b将变量 a 和 b 逐位进行异或操作
<<左移a << 4将变量 a 中的每一位向左移动4位
>>右移x >> n将变量 x 中的每一位向右移动4位
  • ~ : 按位取反---单目运算符,数据将每一个bit位取反,1变0,0变1

一个字节为例

如:~5 ==> 250;

00000101 ==> 5

11111010 ==> ~5=250

  • &:按位与,两个都为1,结果才为1

              1 & 1 == 1

              1 & 0 == 0

              0 & 0 == 0

              0 & 1 == 0

一个字节为例
如:3 & 2 ==> 2
00000011 ==> 3

00000010 ==> 2

00000010 ==> 3 & 2

  • | :按位或,两个都为0,结果才为0

              1 | 1 == 1

              1 | 0 == 1

              0 | 1 == 1

              0 | 0 == 0

一个字节为例
如:3 | 2 ==> 3
00000011 ==> 3

00000010 ==> 2

00000011 ==> 3 | 2

  • ^ : 按位异或 --- 不同为1,相同为0

              1 ^ 0 == 1

              0 ^ 1 == 1

              0 ^ 0 == 0

              1 ^ 1 == 0

一个字节为例
如:3 | 2 ==> 1
00000011 ==> 3

00000010 ==> 2

00000001 ==> 3 ^ 2

  • << : 左移,按bit位往左移动

    假设该数 为 x

    x << n :将 x 的bit序列 整体左移 n个bit 位

    高位左移后,直接丢弃

       低位空出n 个bit 位 全部补0

一个字节为例
如:3 << 2 ==> 12 == 3*2^2 
    00000011 ==> 3

00001100 ==> 3<<2

  • >> : 右移

    假设该数 为 x

    x >> n :将 x 的bit序列 整体右移 n个bit 位

    低位右移后,直接丢弃

       高位空出n 个bit 位 补什么,看是有无符号 ​ ​ 无符号 :高位补0 ​ ​ 有符号:高位补符号位

一个字节为例
如:12 >> 2 ==> 12 == 3/2^2 
00001100 ==> 12

   00000011 ==> 12<<2

位运算应用

例题

编写一段代码计算一个int类型的数有多少位1。

我们知道,在位运算过程中,与1进行按位与只有当两者都是1时结果为1

1&1=1;

否则都为0,我们可以通过这一特性来计算,代码如下:

#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    int count = 0;
    for(int i=0;i<sizeof(int)*8;i++)
    {
        n = n>>i;
        if(n&1)
        count++;
    }
    printf("%d\n",count);
    return 0;
}

位运算在加密解密的运用也十分重要,一般通过异或运算达到这种效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值