1.移位操作符
左移操作符(<<):左边抛弃,右边补0(补码)右移操作符(>>):左边用原该值的符号位填充,右边丢弃
移位操作符移位后需要重新赋值,不能移动负数位。
2.位操作符
&
//
按位与
|
//
按位或
^
//
按位异或
注:他们的操作数必须是整数。
(1).将某数的某位置从0改成1,或者将1改为0
#include <Stdio.h>
int main()
{
int a = 7, b = -5;
//a的补码00000000000000000000000000000111
//b的补码11111111111111111111111111111011
//将a的第四位由0变成1
int x = 1;
//x的补码00000000000000000000000000000001
x = x << 3;
a = a | x;
printf("%d\n", a);
//将b的第四位由1变成0
int y = 1;
//y的补码00000000000000000000000000000001
y = y << 3;
y = ~y;
b = b & y;
//b的补码11111111111111111111111111110011
printf("%d\n", b);
}
(2).编写代码实现:求一个整数存储在内存中的二进制中1的个数。
//方法1
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//计数
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
//思考这样的实现方式有没有问题?
//方法2:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
//思考还能不能更加优化,这里必须循环32次的。
//方法3:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到。
(3).不能创建临时变量(第三个变量),实现两个数的交换
#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;
}
//还可以用两数之和相加存到其中一个变量里,然后减去另一个变量去实现交换
3. sizeof 和 数组
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
//问:
//(1)、(2)输出40 10
//(3)、(4)输出4 4