C语言之位运算符

位运算符分析

1.C语言中的位运算符

   C语言中的位运算符直接对bit位进行操作,其效率最高。速度快于四则运算和逻辑运算。

2.左移和右移的注意点

  -左操作数必须为整数类型

   ·char和short被隐式转换为int后进行移位操作

-右操作数的范围必须为:[0,31];

-左移运算符<<将运算数的二进制位左移

 ·规则:高位丢弃,低位补0

-右移运算符>>把运算数的二进制位右移

 ·规则:高位补符号位,低位丢弃

问题1: 0x01 << 2 + 3的值会是什么?

参考代码:

//位运算符测试
#include <stdio.h>

int main(void)
{
	printf("%d\n", 3 << 2 ); // 11 << 2 ==> 1100 ==> 12
	printf("%d\n", 3 >> 1 ); // 11 >> 1 ==> 1 ==> 1
	printf("%d\n", -1 >> 1 ); //-1所有都位都是-1,因此右移之后还是-1
	printf("%d\n", 0x01 << 2 + 3); // 0x01 << (2 + 3) ==> 0x20 ==> 32
        printf("%d\n", 3 >> -1 ); //未知,不同编译器结果不同
	return 0;
}

运行结果:

注意:位运算符的优先级是低于四则运算符的

在位运算符,逻辑运算符,数学运算符混合的情况下注意事项:

-避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中

-当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达就算次序。

小技巧:

左移n位相当于乘以2的n次方,但是效率比数学运算符高

右移n位相当于除以2的n次方,但是效率比数学运算符高

问题2:如何在不引入第三变量的情况下交换两个变量的数据

参考代码:

#include <stdio.h>

#define swap(a, b)		{			\
				    a = a ^ b;		\
				    b = a ^ b;		\
				    a = a ^ b;		\
				}


int main()
{
	int a = 1;
	int b = 2;
	printf("a = %d\n", a);
	printf("b = %d\n", b);

	swap(a,b);

	printf("a = %d\n", a);
	printf("b = %d\n", b);

	return 0;
}

实验结果:

 

2.位运算与逻辑运算

位运算与逻辑运算不同处:

-位运算没有短路规则,每个操作数都参与运算

-位运算的结果为整数,而不是0或者1

-位运算优先级高于逻辑运算优先级,低于数据运算优先级

概念混淆的判断条件:

参考代码:

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    
    if( ++i | ++j & ++k )
    {
        printf("Run here...\n");
    }

    printf("i = %d, j = %d, k = %d\n",i,j,k); //if中的判定使用都是位运算符,位运算符每个成员都需要进行计算,不存在短路规则
    

    i = 0;
    j = 0;
    k = 0;
    
    if( ++i || ++j && ++k )
    {
        printf("Run here...\n");
    }

    printf("i = %d, j = %d, k = %d\n",i,j,k); //if中判定使用都是逻辑运算符,存在短路规则

    return 0;
}

实验结果:

 

总结:

·位运算符只能用于整数类型(float类型不适用)

·左移和右移运算符的右操作数范围必须为[0,31]

·位运算没有短路规则,所有操作数均会求值

·位运算的效率高于四则运算和逻辑运算

·运算优先级:四则运算 > 位运算 > 逻辑运算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Joyce_JTR

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

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

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

打赏作者

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

抵扣说明:

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

余额充值