4.27操作符练习

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

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值