-
简介
-
移位操作符
-
<<:左移操作符
-
移动的是二进制的数,即存储在计算机内部的数的补码
移动之后再右边补零
>>:右移操作符
同左移操作符
移动之后补的数分两种情况:
(1).逻辑右移:移动后左边补1
(2).算术右移:移动后左边补原符号位
位操作符:
(1).&:按位与
两个数的补码的对应位都为1才为1,有0即为0
(2).|: 按位或
两个数的补码的对应位上有1则为1,全0才为0
(3).^: 按位异或
两个数的补码的对应位上相同则为0,不同则为1
a^a==0 a^0==a
(4).~: 按位取反
该数的补码取反,包括符号位
~x=-(x+1)
-
应用
-
不能创建临时变量(第三个变量),实现两个数的交换。
int main()
{
int a = 3;
int b = 5;
//方法一
printf("a=%d,b=%d", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("\na=%d,b=%d", a, b);
//但是会可能会出现数的大小超过整形大小的情况
//所以
//方法二:使用按位异或来解决
a = a ^ b;
b = a ^ b;
//b=a^b^b=a^0=a
a = a ^ b;
//a=a^b^a=b
printf("\na=%d,b=%d", a, b);
return 0;
}
编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。
方法一
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int count = 0;
while (n != 0)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;
}
printf("%d\n", count);
}
return 0;
}
方法二
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int count = 0;
for (int i = 0;i < 32;i++)
{
if ((n >> i) & 1)
count++;
}
printf("%d\n", count);
}
return 0;
}
方法三
扩展一个算法:n=n&(n-1)
该算法的作用是去掉该数二进制位上最右边的1
int main()
{
int n;
scanf("%d", &n);
int count = 0;
while (n != 0)
{
n = n & (n - 1);
count++;
}
printf("%d\n", count);
return 0;
}
提问:如何判断一个数是否为2的n次方数
思路一:可以看该数的二进制里有几个1,只有一个1的是
就直接:if(n=n&(n-1)==0)
二进制位置1或者置0
int main()
{
int n = 13;
//把第5位改成1
n |= (1 << 4);
printf("%d\n", n);
//改回来
n &= (~(1 << 4));
printf("%d\n", n);
return 0;
}
-
优先级