C语言绝对值得一看的常识讲解:位运算符的功能篇

之前介绍运算符时提到了位运算符,但是对于位运算符的功能,大家可能没有比较直观的认识,所以这篇文章就和大家详细介绍一下位运算符的功能及代码实现。

目录

1.按位与运算符(&)

1.1“按位与”可以将指定的存储单元中的数清零,也可以将指定的二进制位变为0。

1.2“按位与”可以截取一个整数中的某些特定位置。

1.3“按位与”可以将一个整数中特定的位置保留下来,并使得其他位变为0。

2.按位与运算符(|)

3.按位异或运算符(^)

3.1使特定位翻转。

3.2与0相^,保留原值。

3.3不使用临时中介变量,而直接交换两个值。

4.按位取反运算符(~)

5.左移运算符(<<)

6.左移运算符(>>)


1.按位与运算符(&)
1.1“按位与”可以将指定的存储单元中的数清零,也可以将指定的二进制位变为0。

需要清零时,可以按照以下方法选择一个整数:将待清零整数中为1的位,选择的整数的相应的位为0(满足该条件的数可能有很多,随意选择一个即可)。然后将待清零整数与新选择的整数进行“&”运算,得到的整数指定的位即为0。

#include<stdio.h>
int main()
{
	int a=4;//现在欲使a变成0 ,已知a的二进制数为00000000000000000000000000000100 ,则选择的数从右至左第三位应该为0 
	int b=1;//按照上面的分析1,2,3等均满足从右至左第三位应该为0,那么直接将其与a进行按位与运算即可
	a=a&b;
	printf("%d",a); 
	return 0;
} 

上面的代码,大家可以自己敲一敲试试,加深理解。当然,更建议大家多尝试几个不同的a值,从而对于按位与运算符的使用更熟练和清晰。

1.2“按位与”可以截取一个整数中的某些特定位置。
#include<stdio.h>
int main()
{
	int num;
	scanf("%d",&num);//我们这里输入1754,其二进制为000011011011010 
	printf("%d",num&255);//255的二进制为,11111111,那么根据按位与运算符的功能,1754的高八位直接清零,我们就得到其低八位 
	return 0;
}

我们想得到某些特定的位置,只需要找到我们要的位置均为1的数,并将它和要求的数进行按位与运算即可。

1.3“按位与”可以将一个整数中特定的位置保留下来,并使得其他位变为0。

方法是选取一个整数,该整数中相应的特定位为1,其他位为0。将选择的数与原来的整数进行按位与的运算,运算结果即可保留原整数位的特定位。

#include<stdio.h>
int main()
{
	int num;
	scanf("%d",&num);//我们这里输入1754,其二进制为000011011011010 
	printf("%d",num&255);//255的二进制为,11111111,那么根据按位与运算符的功能,1754的高八位直接清零,我们就得到其低八位 
    num=num&255;
	return 0;
}

其实所谓的第三功能就是在第二功能的基础上,将最后得到的值赋给原整数。

2.按位与运算符(|)

按位与运算符常用来将一个整数的某些特定位,置换为1。

#include<stdio.h>
int main()
{
	int a=1;
	a=a|255;
	printf("%d",a);
	return 0;
}

如上面的代码所展示,由于按位与运算符的特点,我们只需要让选择的数的特定位为1,那么无论原数该位是否为1,最终都会变成1。

3.按位异或运算符(^)
3.1使特定位翻转。

选择一个整数,其特定位为1,其他位为0,然后将待翻转位的整数与选择的整数进行“^”运算。

#include<stdio.h>
int main()
{
	int a=10;//10的二进制数为 1010 ,我们这里就翻转最高位的1,那么就找该位置为1的,其他位为0数即可
	int b=8; //24的二进制数为 1000,所以结果应该为2
	printf("%d",a^b);
	return 0;
} 
3.2与0相^,保留原值。
#include<stdio.h>
int main()
{
	int a=12;
	printf("%d",a^0);
	return 0;
 } 

按位异或的特点就是只有相异才会等于1,而0各个位置均为0,0与任何数进行按位异或运算时,该数为0的位置因为相同仍为0,为1的位置因为相异仍为1 

3.3不使用临时中介变量,而直接交换两个值。
#include<stdio.h>
int main()
{
	int a=2,b=3;
	a=a^b;
	b=b^a;
	a=a^b;
	printf("%d %d",a,b);
	return 0;
}

在上面的代码中,由前两个赋值语句“num=num^(num1^num2)”,“num2^(num1^num2)”等价于“num1^(num2^num2)”。由于任何一个数与本身相异或,结果均为0。因此num2得到了num1的值,num1通过第三个赋值语句也得到num2的值。

4.按位取反运算符(~)

功能是对运算数的二进制位按位“求反”。即,将0变成1,将1变成0。这个就没什么好介绍的,大家根据需求使用即可。

例如,(~)(00010101)的结果为11101010

~运算符的优先级高于算术运算符、关系运算符、逻辑运算符以及其他位运算符。

5.左移运算符(<<)

左移运算符(<<)是二元运算符,结合方向为自左向右,其功能是把“<<”左边的运算数的各二进制位依次左移,移动的位数由“<<”右边的运算数指定。

左移时,高位溢出被舍弃,低位需要补若干个0。

可用于是一个整数左移一位,相当于乘以2,左移n位相当于乘以2^n。左移运算速度比乘法运算速度要快得多。

6.右移运算符(>>)

右移运算符(>>)是二元运算符,结合方向为自左至右,其功能是把“>>”左边的运算数的各二进制位依次右移,移动的位数由“>>”右边的运算数指定。

右移位运算时,低位移出被舍弃。对于高位的处理,需要分情况处理:若是无符号数,右移时高位补0;而对于有符号数,并且原来的符号位为1,即原数为负数时,则左边移入的是0还是1取决于所用的编译系统。若移入的是0,称为“逻辑右移”,即简单的右移;若移入的为1,称为“算术右移”。

可用于是一个整数右移一位,相当于除以2,左移n位相当于除以2^n。右移运算速度比除法运算速度要快得多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值