惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
博客园 - Franky
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
小众软件
小众软件
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
C
Check Point Blog
WordPress大学
WordPress大学
博客园 - 【当耐特】
博客园 - 司徒正美
D
Docker

Oskyla 烹茶室

修复 Joplin on KDE 菜单栏显示问题 Copy Fail:Linux 内核 2017 年至今的高危漏洞(附临时缓解方案) | CVE-2026-31431 Hermes Agent — 在 K3s / K8s 中运行指南 在 K3s 节点上安装并使用 nerdctl Mouser:轻量开源的罗技鼠标驱动替代方案 Claude Opus 4.7:优缺点与评测信息汇总 openFuyao NPU-Operator故障排查 openFuyao 2603 共测测试报告 openFuyao InferNex AI推理集成部署 310P(300I Pro) 环境问题记录及解决 ceph mon Operation not permitted 问题解决 Ascend 310P + openFuyao + NPU-Operator 故障排查 KDE Plasma6 禁用全局菜单,恢复正常应用菜单 终极指南:在 Linux 裸机服务器上快速部署 Moltbot (原 Clawbot) 并集成飞书 Windows 配置 Claude Code 解决 settings.json 不生效 Windows 配置 Claude Code 全流程 2025-12-31 | 年终总结 AI 生图精品提示词|第二期:城市星球 AI 生图精品提示词|第一期 Kubernetes kubectl --raw 使用指南 彻底解决阿里云和 tailscale 冲突 2025-10-21 | 沉淀思维 macOS 单独为鼠标或触控板开启自然滚动 2025-10-16 | 负载高低 2025-10-15 | 睡眠周期 2025-10-14 | 转换情绪与独立观点 go 拉取 gitcode.com 私有 mod Git 将某个文件恢复到其他分支的状态 SSH 通过跳板机连接 lxc 使用 chronyc 构建 ntp 服务 2025-10-13 | 独立思考于未来能源
C 实现零空间开销交换两个数的值
Tianlun Song · 2021-11-03 · via Oskyla 烹茶室

本文 首发于 🌱 煎茶转载 请注明 来源

C 实现的不引入新变量交换两数的方法.

最近看到一个问题感觉很有意思:

“如何在不申请临时变

量的情况下交换两个数的值?”

思考许久没有思路,查阅一番发现方法不少,在这里介绍四种方法:

方法一

void swap(int *a, int *b)
{
    *a = *a ^ *b;
    *b = *b ^ *a;
    *a = *a ^ *b;
}

提示:异或运算符 ^ 也称 XOR 运算符,它的规则是若参加运算的两个二进位同号,则结果为 0 (假);异号为 1(真)。即 0 ^ 0 = 0 , 0 ^ 1 = 1 , 1 ^ 0 = 1 , 1 ^ 1 = 0

计算实例:

a = 3 -> 0000 0011
b = 4 -> 0000 0100

step1:
	a = a ^ b
	->  0000 0011
	 ^  0000 0100
	  = 0000 0111 -> 7

step2:
	b = b ^ a
	->  0000 0100
	 ^  0000 0111
	  = 0000 0011 -> 3

step3:
	a = a ^ b
	->  0000 0111
	 ^  0000 0011
	  = 0000 0100 -> 4

方法二

void swap(int *p, int *q)
{
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

方法三

void swap(int *p, int *q)
{
    *a = *a + *b - (*b = *a);
}

C/C++ 中 ( A = B ) 返回得到是赋值号( = )的左面的值

计算实例:

a = 3;
b = 4;

a = 3 + 4 - (b = 3)
  = 3 + 4 - 3
  = 4;

-> a = 4;
-> b = 3;

方法四

void swap(int *p, int *q)
{
    *a ^= *b ^= *a ^= *b;
}
计算实例:

a = 3;
b = 4;

a = 3 ^ 4 = 7;
b = 4 ^ 7 = 3;
a = 7 ^ 3 = 4;

-> a = 4;
-> b = 3;

参考文献