【C语言之】二进制的四种位运算:取反、与、或、异或

news/2024/12/23 21:09:20 标签: c语言, 开发语言, 算法, 数据结构

【C语言之】二进制的四种位运算:取反、与、或、异或

1、按位取反运算( bit not : ~ )

  • 对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。
  • 取反运算符,按二进制位进行"取反"运算。运算规则:
  s1:  ~ 0  ===> 1
  s2:  ~ 1  ===> 0
  • 示例如下:
  ~ 1001 0110
---------------
    0110 1001

2、按位与运算( bit and : & )

  • 对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。
  • 按位与操作,按二进制位进行"与"运算。运算规则:
  s1:  0 & 0 ===> 0
  s2:  1 & 0 ===> 0
  s3:  0 & 1 ===> 0
  s4:  1 & 1 ===> 1
  • 示例如下:
    0100 1101
  & 0011 0101
---------------
    0000 0101

3、按位或运算( bit or : | )

  • 对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。
  • 按位或运算符,按二进制位进行"或"运算。运算规则:
  s1:  0 | 0  ===> 0
  s2:  0 | 1  ===> 1
  s3:  1 | 0  ===> 1
  s4:  1 | 1  ===> 1
  • 示例如下:
    0100 1101
  | 0011 0101
---------------
    0111 1101

4、按位异或运算( bit xor : ^ )

  • 对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。
  • 异或运算符,按二进制位进行"异或"运算。运算规则:
  s1:  0 ^ 0  ===> 0
  s2:  0 ^ 1  ===> 1
  s3:  1 ^ 0  ===> 1
  s4:  1 ^ 1  ===> 0
  • 示例如下:
    0100 1101
  ^ 0011 0101
---------------
    0111 1000

5、保留字节的某些位

  • 保留字节的后四位,与0x0F按位与即可,测试代码如下:
/* filename : wb.c */
#include <stdio.h>

/* get bits */
void
get_bits (void)
{
  char x = 0X5B;  //#b 0101 1010
  char f = 0X0F;  //#b 0000 1111
  char c = x & f; //#b 0000 1010
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit AND ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/**/
int
main (int argc, char *argv[])
{
  get_bits ();
  return 0;
}
//----- ~&|^ -----//

6、编译运行,输出结果如下:

  • 达到预期,0x5B的后四位B保留了下来!
Char x : [0X5B]
Char f : [0X0F]
bit AND ----------
Result : [0X0B]

7、设置字节的某些位

  • 按位或某个数,相当于加上某个数,如按或0x06,相当于加上0x06,测试代码如下:
/* set bits */
void
set_bits (void)
{
  char x = 0X30;  //#b 0011 0000
  char f = 0X06;  //#b 0000 0110
  char c = x | f; //#b 0011 0110
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit OR  ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

8、编译运行,输出结果如下:

  • 达到预期,0x30的后四位加上了一个6!
Char x : [0X30]
Char f : [0X06]
bit OR  ----------
Result : [0X36]

9、按位异或常用来交换两个变量的值

  • 两个数进行两次异或操作,就能达到交换两个数的值的效果,代码如下:
/* swap a, b */
void
test_swap (void)
{
  char a = 0X70; //#b 0111 0000
  char b = 0X07; //#b 0000 0111
  printf ("before swap => a : [0X%02X], b : [0X%02X]\n", a, b);
  a = a ^ b;     //#b 0111 0111
  b = b ^ a;     //#b 0111 0000
  a = a ^ b;     //#b 0000 0111
  printf (" after swap => a : [0X%02X], b : [0X%02X]\n", a, b);
}

10、编译运行,输出结果如下:

  • 达到预期,a和b的值交换了!
before swap => a : [0X70], b : [0X07]
 after swap => a : [0X07], b : [0X70]

11、完整代码如下:

/* filename : wb.c */
#include <stdio.h>

/* swap a, b */
void
test_swap (void)
{
  char a = 0X70; //#b 0111 0000
  char b = 0X07; //#b 0000 0111
  printf ("before swap => a : [0X%02X], b : [0X%02X]\n", a, b);
  a = a ^ b;     //#b 0111 0111
  b = b ^ a;     //#b 0111 0000
  a = a ^ b;     //#b 0000 0111
  printf (" after swap => a : [0X%02X], b : [0X%02X]\n", a, b);
}

/* set bits */
void
set_bits (void)
{
  char x = 0X30;  //#b 0011 0000
  char f = 0X06;  //#b 0000 0110
  char c = x | f; //#b 0011 0110
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit OR  ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/* get bits */
void
get_bits (void)
{
  char x = 0X5B;  //#b 0101 1010
  char f = 0X0F;  //#b 0000 1111
  char c = x & f; //#b 0000 1010
  printf ("Char x : [0X%02X]\n", x);
  printf ("Char f : [0X%02X]\n", f);
  printf ("bit AND ----------\n");
  printf ("Result : [0X%02X]\n", c);
}

/**/
int
main (int argc, char *argv[])
{
  test_swap ();
  //set_bits ();
  //get_bits ();
  return 0;
}
//----- ~&|^ -----//

http://www.niftyadmin.cn/n/5797005.html

相关文章

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…

Linux网络功能 - 服务和客户端程序CS架构和简单web服务示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述准备工作扫描服务端有那些开放端口创建客户端-服务器设置启动服务器和客户端进程双向发送数据保持服务器进程处于活动状态设置最小…

【优选算法---分治】快速排序三路划分(颜色分类、快速排序、数组第K大的元素、数组中最小的K个元素)

一、颜色分类 题目链接: 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序…

目标检测文献阅读-Faster R-CNN:通过区域建议网络实现实时目标检测(12.16-12.22)

目录 摘要 Abstract 1 引言 2 Fast R-CNN 2.1 RoI池化层 2.2 多任务损失 3 RPN 3.1 Anchors 3.2 损失函数 3.3 训练RPN 4 RPN和Fast R-CNN共享特征 总结 摘要 本周阅读的论文题目是《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Netw…

MySQL 中的常见错误与排查

在 MySQL 数据库的日常运维中&#xff0c;管理员可能会遇到各种错误。无论是查询性能问题、连接异常、数据一致性问题&#xff0c;还是磁盘空间不足等&#xff0c;及时排查并解决这些问题是保证数据库稳定运行的关键。本文将列出 MySQL 中一些常见的错误及其排查方法。 一、连接…

centOS系统进程管理基础知识

进程的概念与属性 1.进程是系统中正在执行的代码片段&#xff0c;也可以称为一个程序。 2.操作系统通过分配进程编号&#xff08;PID&#xff09;来管理进程。 3.进程属性包括PID、PPID、UID、GID、状态、优先级、终端名和资源占用等。 PS命令与进程查看 1.PS命令用于查看进程…

设计模式 -- 单例模式

设计模式 -- 单例模式 单例模式C++ 实现饿汉式单例模式懒汉式单例模式使用静态局部变量实现懒汉式单例模式(推荐)使用call_once实现懒汉式单例模式(推荐)使用静态全局部变量和指针的方式实现懒汉式单例模式(不推荐)双重检测懒汉式单例模式单例模式 单例模式:确保在整个程…

xenomai环境下开源实时数控系统LinuxCNC EtherCAT编译安装

LinuxCNC是一款基于Linux操作系统的开源实时数控系统&#xff0c;可将普通计算机转变为高效的CNC&#xff08;计算机数字控制&#xff09;机器&#xff0c;本文记录xenomai下linuxcnc的构建简单记录&#xff0c;xenomai下构建无特别之处&#xff0c;主要参考链接https://www.li…