一.移位操作符:
注:移位操作符的操作数只能为整数,且不能为负数。
<<:左移操作符
移位规则:左边抛弃,右边补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
包含从0
到n
的所有整数,但其中缺了一个,请编写代码找出那个缺失的整数。
#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。
以上便是本篇文章全部内容,制作不易,求三连。