深入了解C语言中的按位逻辑运算

了解C语言中的按位逻辑运算:

在C语言中,按位运算符是处理二进制数据的强大工具。按位运算符可以直接操控数据的每一位,这使得它们在处理低级别的数据操作、优化性能、嵌入式系统开发、加密算法等场景中变得尤为重要。在这篇博客中,我们将深入探讨几种常见的按位逻辑运算符,包括按位与 (AND)、按位或 (OR)、按位异或 (XOR)、按位取反 (NOT) 等,并展示如何在C语言中使用它们。

接下來我們就以宏定義的方式來説明:

以下是一些常见的按位逻辑运算符及其定义:

按位或 (OR): #define OR(a, b) ((a) | (b))

只要 a 或 b 的对应位有一个为 1,结果的对应位就为 1。否则为 0。

按位与 (AND): #define AND(a, b) ((a) & (b))

只有当 a 和 b 的对应位都为 1 时,结果的对应位才为 1。否则为 0。

按位异或 (XOR): #define XOR(a, b) ((a) ^ (b))

当 a 和 b 的对应位不同时,结果的对应位为 1;相同时,结果的对应位为 0。

按位或取反 (NOR): #define NOR(a, b) (~((a) | (b)))

对 OR 操作的结果取反。

按位与取反 (NAND): #define NAND(a, b) (~((a) & (b)))

对 AND 操作的结果取反。

按位异或取反 (NXOR): #define NXOR(a, b) (~((a) ^ (b)))

对 XOR 操作的结果取反。

按位取反 (NOT): #define NOT(a) (~a)

对 a 的每一位取反。

值取反 (TURN): #define TURN(a) (~a+1)

这通常用来获取一个数的补码。

示例代码

c 复制代码
#include <stdio.h>
#include "LogicalOperator/Logical.h"

#define OR(a, b)   ((a) | (b))        // 按位逻辑或,两个位的值有一个为真结果为真
#define AND(a, b)  ((a) & (b))        // 按位逻辑与,两个位的值都为真结果为真
#define XOR(a, b)  ((a) ^ (b))        // 按位逻辑异或,两个位的值不一样为真
#define NOR(a, b)  (~((a) | (b)))     // 按位逻辑或,两个位的值有一个为真结果为真,按位取反
#define NAND(a, b) (~((a) & (b)))     // 按位逻辑与,两个位的值都为真结果为真,按位取反
#define NXOR(a, b) (~((a) ^ (b)))     // 按位逻辑异或,两个位的值不一样为真,按位取反
#define NOT(a)     (~a)               // 按位取反
#define TURN(a)    (~a+1)             // 值取反

int main(int argc, char const *argv[])
{
    int a = 127; 
    int b = 10;

    printf("OR(%d, %d) = %d\n", a, b, OR(a, b));    // 输出 OR 结果
    printf("AND(%d, %d) = %d\n", a, b, AND(a, b));  // 输出 AND 结果
    printf("XOR(%d, %d) = %d\n", a, b, XOR(a, b));  // 输出 XOR 结果
    printf("NOR(%d, %d) = %d\n", a, b, NOR(a, b));  // 输出 NOR 结果
    printf("NAND(%d, %d) = %d\n", a, b, NAND(a, b));// 输出 NAND 结果
    printf("XNOR(%d, %d) = %d\n", a, b, NXOR(a, b));// 输出 XNOR 结果
    printf("NOT(%d) = %d\n", a,  NOT(a));           // 输出 NOT 结果
    printf("TURN(%d) = %d\n", a,  TURN(a));         // 输出 TURN 结果

    return 0;
}
假设我们执行上述代码,给定 a = 127 和 b = 10,每个操作的结果如下:

OR(127, 10) = 127

二进制表示:127 = 01111111,10 = 00001010,OR 结果:01111111 = 127
AND(127, 10) = 10

二进制表示:127 = 01111111,10 = 00001010,AND 结果:00001010 = 10
XOR(127, 10) = 117

二进制表示:127 = 01111111,10 = 00001010,XOR 结果:01110101 = 117
NOR(127, 10) = -128

NOR 结果:10000000 对应 -128(在二进制中最高位为符号位)
NAND(127, 10) = -11

NAND 结果:11110101 对应 -11
XNOR(127, 10) = -118

XNOR 结果:10001010 对应 -118
NOT(127) = -128

NOT 结果:01111111 取反为 10000000,即 -128
TURN(127) = -127

TURN 结果为 -127,即补码表示。

按位运算在处理底层数据时是非常高效和必要的。通过简单的按位操作,您可以实现复杂的逻辑计算,控制位级别的数据处理。掌握这些运算符,不仅能提升您在C语言中的编程技巧,还能为编写高性能、低级别的代码奠定坚实的基础。

相关推荐
是立不是利9 分钟前
前端交互基石:深入剖析JavaScript三级联动背后的设计哲学
开发语言·前端·javascript
老刘的望远镜18 分钟前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
java·开发语言·javascript
Littlehero_12127 分钟前
QT自定义控件之电气接线图(源码开源)
开发语言·qt
中科三方42 分钟前
DNS拨测到底在拨测什么?
开发语言·github·php·dns·云拨测
软件黑马王子44 分钟前
20.Resources资源加载:基本实现
开发语言·前端框架·c#
李少兄1 小时前
Java 中只有值传递吗?
java·开发语言·python
可乐鸡翅yeah_2 小时前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
szarron2 小时前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
边境悍匪2 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
万物智能信息科技2 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos