位运算及其应用实例

C语言位运算及其应用

众所周知,数据在计算机内存中都是以二进制的形式存放的。
在计算机发展早期,位运算是C语言特有的运算。深入理解位运算有助于C语言学习进阶。

位运算是按数据在内存中存放的补码进行运算的。
正数的源码,反码,补码都相同。负数的源码(除符号位)按位取反得到反码,反码+1得到补码。

位运算介绍

1.按位与&

操作数如果对应的二进制位的值都为1,则该二进制位按位与的结果为1,否则为0;
3&5=1
在这里插入图片描述

2.按位或 |

操作数如果对应的二进制位的值都为0,则该二进制位按位或的结果为0,否则为1;
3|5=7;
在这里插入图片描述

3.按位异或 ^

操作数如果对应的二进制位的值不同,则该二进制位按位异或的结果为1,否则为0;
3^5=6;
在这里插入图片描述

4.按位取反 ~

将操作数的每一位进行取反,即1改为0,0改为1;
~123=-124;
在这里插入图片描述

5.多组输入

在做题时,题目中经常会出现多组输入的要求。
可以使用EOF;
在这里插入图片描述
因为EOF被定义为-1;而~(-1)=0;因此可以采用另一种方式:
在这里插入图片描述

6.交换两个值,不用临时变量

题目:a=3,b=4;不准使用临时变量,交换a,b的值。
此题可以将a,b按位异或解决

    int a = 3;
	int b = 4;
	a = a^b;
	b = b^a;
	a = a^b;

经过3次按位异或
在这里插入图片描述

7.保留数据中的某些位

题目;a=0x12345678;保留a的低字节,高字节舍弃。
分析:a 的低字节是5678,每位与1按位与。
高字节为1234,需要将其变为0,每位与0按位与。

因此a&b,b的高字节位为0,低字节位为1.
b=00000000000000001111111111111111
即b=0x0000FFFF

int main()
{
    
    
	int a = 0x12345678;
	int b = 0x0000FFFF;
	
	a = a&b;
	printf("%x", a);

	return 0;
}

结果 a=0x00005678;

8.将一个数据的某些位变为1

题目:a=0x12345678;将a的第10位变为1;
分析:将1左移10位,再与a按位或。

int main()
{
    
    
	unsigned int a = 0x12345678;
	
	a = a | (1 << 10);

	printf("%x", a);
	return 0;
}

除此之外,位运算还有很多奇技淫巧,时常令人拍案叫绝。

猜你喜欢

转载自blog.csdn.net/weixin_50941322/article/details/114065225
今日推荐