C语言进阶技巧:异或/加减法交换变量及itoa进制转换实操

顾星河
顾星河
发布时间:2026-10-14| 5人浏览过
原创

本文详细讲解C语言中不借助第三方变量的两种核心交换算法——异或运算与算术减法,并提供使用itoa库函数进行多进制数制转换的完整代码示例,帮助开发者掌握底层数据操作技巧。

无临时变量交换整型数值

在C语言编程中,交换两个变量的值通常是借助第三个临时变量完成的。但在特定场景下(如嵌入式开发或对内存敏感的环境),可以通过位运算或算术逻辑在不分配额外空间的情况下完成交换。以下是三种经典且正确的实现方式:

第1步:使用异或运算(XOR)

异或运算具备自反性:a ^ b ^ a == b。通过三次异或操作,可以将 b 的值赋给 a,再将原始 a 的值赋给 b。这种方法不涉及浮点运算,执行效率高。

#include <stdio.h>
void xor_swap() {
    int a = 3;
    int b = 4;

    a = a ^ b;
    b = b ^ a;
    a = a ^ b;

    printf("After XOR: %d, %d\n", a, b);
}

第2步:使用算术逻辑(加减法)

利用加法累加和减法提取差值的原理。第一步将 a-b 存回 a,第二步将新的 a 加上原来的 b 存入 b(此时 b 为原 a 值),第三步从新 b 减去新 a 得到原 b。注意:此方法在极端大数相加时可能存在溢出风险。

#include <stdio.h>
void arithmetic_swap() {
    int a = 3;
    int b = 4;

    a = a - b;      // a 现在存储的是 (原a - 原b)
    b = a + b;      // b 变成 (原a - 原b) + 原b = 原a
    a = b - a;      // a 变成 原a - (原a - 原b) = 原b

    printf("After Arithmetic: %d, %d\n", a, b);
}

第3步:链式异或赋值

C语言允许在一行代码中组合赋值与异或。虽然简洁,但不同编译器的求值顺序可能带来不可预期的副作用,仅在明确语法定义的编译器中使用。

int a = 3; int b = 4;
a ^= b ^= a ^= b;

整数与字符数组的多进制转换

在进行数据存储、序列化或日志输出时,经常需要将整数转换为特定进制的字符串。C标准库提供了 itoa 函数(通常在 <stdlib.h> 中,虽非所有标准强制,但在主流环境可用)来完成这一任务。

第1步:初始化与环境准备

包含必要的头文件 <stdio.h> 和 <stdlib.h>。定义一个足够容纳结果的字符数组,例如 char c[10],以及待转换的整数 i。

第2步:执行多进制转换

itoa(int value, char *str, int base) 是核心接口。它会将 value 按 base 进制转换为字符串并存储到 str 中。常见的进制参数包括 10(十进制)、16(十六进制)、8(八进制)和 2(二进制)。

#include <stdio.h>
#include <stdlib.h>

// 辅助函数:计算二进制中1的个数
int count_set_bits(int x) {
    int countx = 0;
    while(x) {
        countx++;
        x &= x - 1; // 清除最低位的1
    }
    return countx;
}

void main(){
    char c[10];
    int i = 999;

    // 十进制转换
    itoa(i, c, 10);
    puts(c); 

    // 十六进制转换
    itoa(i, c, 16);
    printf("0x%s\n", c);

    // 八进制转换
    itoa(i, c, 8);
    printf("0%s\n", c);

    // 二进制转换
    itoa(i, c, 2);
    puts(c);

    // 反向转换:字符串转回整数
    i = atoi(c); 
    printf("Reverted int: %d\n", i);

    // 统计转换后的二进制1的个数
    printf("Set bits: %d\n", count_set_bits(999));
}

第3步:注意事项

虽然 itoa 很方便,但它不是 ANSI C 标准的一部分(标准替代方案推荐使用 sprintf(str, "%x", val))。在实际生产环境中,若追求跨平台兼容性,建议优先使用 sprintf 系列函数处理格式转换。此外,务必确保目标字符数组有足够的大小,以避免缓冲区溢出。

以上就是C语言中关于变量交换与进制转换的详细技术解析。本文涵盖了底层算法逻辑与标准库函数的实际运用,更多关于C语言底层机制与优化技巧的资料,请关注本站后续更新!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。