【C】替换空格,宏实现整数的二进制奇偶位交换

在这里插入图片描述
博客主页: XIN-XIANG荣
系列专栏:【从0到1,C语言学习】
一句短话:你若盛开,蝴蝶自来!
博客说明:尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区留言,我们一起交流进步!😊

前言

😽介绍俩道基础题,使用C语言实现,题目不只文章中的一种做法,只是记录一下这些对于初学者来说不容易想到的思路!

一. 替换空格

1. 题目要求

img

img

2. 解题思路

首先求出字符串中有几个空格,

每个空格都需要用%20来替换,%20是三个字符的空间,而原来的空格只占一个字符的空间,也就是说,每有一个空格都需要增加俩个字符的空间才能够将空格替换;

用end1记录原来字符串末字符的位置,用end2记录在原来字符串末尾增加上替换空格所需要增加空间后的位置

img

然后将end1空间的内容赋值到end2,end1和end2再往前移动一个空间,只要end1指向的空间放置的内容不是空格,将end1空间的内容赋值到end2;

当end1指向的空间是空格时,此时end1再向前移动到空格前面字符的位置;end2此时向前移动三次,分别放置0、2、%;放置完%后end2再向前移动一位到%前面的位置;

img

重复上述过程直到end1和end,也就是end1和end2指向的位置重合时,所有的空格都被替换完毕。

img

3. 代码实现

class Solution {
public:
    void replaceSpace(char* str, int length) {
        char* cur = str;
        int space_count = 0;
        while (*cur)
        {
            if (*cur == ' ')
            {
                space_count++;
            }
            cur++;
        }
        int end1 = length - 1;
        int end2 = length - 1 + 2 * space_count;
        while (end1 != end2)
        {
            if (str[end1] != ' ')
            {
                str[end2--] = str[end1--];
            }
            else
            {
                end1--;
                str[end2--] = '0';
                str[end2--] = '2';
                str[end2--] = '%';
            }
        }

    }
};

二. 宏实现整数的二进制奇偶位交换

1. 题目要求

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

2. 解题思路

交换奇偶位,需要先分别拿出奇偶位。

既然是宏,分别拿出用循环不是很现实,那就用**按位与(&)**这些位的方式来做。

奇数位拿出,那就是要&上010101010101……;偶数位拿出,就是要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。

通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。

奇数位左移(<<)一位就到了偶数位上,偶数位右移(>>)一位就到了奇数位上,最后两个数字起来,就完成了交换。

※这个宏只能完成32位以内的整形,要想完成64位的,那就将5和a的数量翻倍即可。

3. 代码实现

#include<stdio.h>
#define SWAP_BIT(num) num = (((num&0x55555555)<<1) + ((num&0xaaaaaaaa)>>1))

int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", SWAP_BIT(a));
	return 0;
}

结语

各位小伙伴,看到这里就是缘分嘛,希望我的这些内容可以给你带来那么一丝丝帮助,可以的话三连支持一下呗😁!!! 感谢每一位走到这里的小伙伴,我们可以一起学习交流,一起进步😉!!!加油🏃!!!

img

  • 74
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韵秋梧桐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值