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

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

前言

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

一. 替换空格

1. 题目要求

73d8c9be8b2a4960a39693770de0ac9a.png

73d8c9be8b2a4960a39693770de0ac9a.png

2. 解题思路

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


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


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

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


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

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

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;
}
目录
相关文章
|
7月前
|
C语言
【汇编语言实战】输入一个无符号整数求其逆序
【汇编语言实战】输入一个无符号整数求其逆序
50 2
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
65 0
|
6月前
实现offsetof宏以及交换一个整数二进制奇偶位的宏
实现offsetof宏以及交换一个整数二进制奇偶位的宏
23 0
实现offsetof宏以及交换一个整数二进制奇偶位的宏
|
6月前
|
C语言
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
|
6月前
|
算法
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
|
7月前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
111 0
|
7月前
|
小程序 C语言
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
112 0
|
7月前
LeetCode题 338比特位计数,20有效的括号,415字符串相加
LeetCode题 338比特位计数,20有效的括号,415字符串相加
66 0
|
7月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
|
7月前
|
C语言
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
49 0