每日一练C,你真的学会了位操作符?

前言:鄙人希望读者先自己做一下,这样收获才会更大,有其他想法可以留言

题1.在一个整型数组中,只有一个数字出现一次,其他数字都是成对出现的,请找出那个只出现一次的数字(找出那个单身狗数字)。

例如:

数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5

想一想,题目有一个前提:数字成对出现,其中在学习过程中我们知道了  a^a=0,a^0=a
那么1^2^3^4^5^1^2^3^4,该按位异或关系位置可以交换,得1^1^2^2^3^3^4^4^5=?


当然是5

#include<stdio.h>
int dog(int ar[9])
{
    int a = 0;
    for (int n = 0; n < 9; n++)
    {
        a ^= ar[n];
    }
    return a;
}
int main()
{
    int arr[9] = { 1,2,3,4,5,1,2,3,4 };
    int ret = dog(arr);
    printf("单身Dog为:%d", ret);
    return 0;
}
 提醒一下:for循环中a经过9次循环即为:
0^ar[0]^ar[1]^ar[2]^……ar[8]^ar[9]=0^1^2^3^4^5^1^2^3^4

改为自己输入数      (感兴趣的小伙伴可以自己编一下)

#define  x  9    //简单理解一下,就是定义x=9,     作用:方便修改
#include<stdio.h>
int dog(int ar[x])
{
    int a = 0;
    for (int n = 0; n < x; n++)
    {
        a ^= ar[n];
    }
    return a;
}
int main()
{
    int arr[x] = { 0 };
    for (int i = 0; i < x; i++)
    {
        scanf("%d", &arr[i]);
    }
    int ret = dog(arr);
    printf("单身Dog为:%d", ret);
    return 0;
}

题 2.不能创建临时变量(第三个变量),输入两个整数实现两个整数的交换

例如:

  输入:a=5,b=3             输出a=3,b=5

方法一:

#include<stdio.h>
int main()
{
	int a = 0, b = 0;
	scanf("%d%d", &a, &b);
	printf("a=%d,b=%d\n", a, b);
	a = a + b; //一式
	b = a - b; //二式   由于a=a+b,  代入二式得b=a+b-b=a
	a = a - b; //三式   在二式中求得b=a,代入三式得a=a+b-a=b
	printf("a=%d,b=%d", a, b);
	return 0;
}

 

 int取值范围为-32768~32767

这个代码是有缺陷的,当a,b足够大的时候,a=a+b 时会发生截断

 方法二(改进):

首先知道:a^a=0     a^0=a

#include<stdio.h>
int main()
{
	int a = 0, b = 0;
	scanf("%d%d", &a, &b);
	printf("a=%d,b=%d\n", a, b);
	a = a ^ b;   // 一式
	b = a ^ b;   // 二式  在一式中 a = a^b代入二式得b = a^b^b = a^0 = a
	a = a ^ b;   // 三式  在二式中 b = a  带入三式a=a^b^a = a^a^b = 0^b = b
	printf("a=%d,b=%d", a, b);
	return 0;
}

 

总结一下:先学会知识点,再做题,做到一题多练。

今天先说到这里,后续还有补充。

想一想今天学到了什么?(您的点赞是对我最大的支持,感谢!)

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茜子.Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值