【C语言】位操作符的应用

简介: 【C语言】位操作符的应用

位操作符的概念:

位操作符有三种:&(按位与)、|(按位或)、^(按位异或)。

需要注意的是:位操作符的操作数为整数,且具体实现操作的是两个整数的补码


原码、补码、反码的概念:

(1)有符号数的原码、补码、反码分为符号位和数值位两部分,符号位为首位二进制数,0表示正数,1表示负数。

(2)正整数的原码、补码、反码相同

(3)负整数原码为符号位1与对应的数值位组成;反码为原码的符号位不变,其它位次按位取反(0变为1,1变为0);补码为反码+1 。


一、&(按位与):两个整数的补码对应的二进制位有0则为0,两个同时为1才为1,得到的数仍为补码。

举个栗子:

//&(按位与)有0为0,同为1为1
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a & b;//补码为:00000000000000000000000000000000
//所以c的值为0

二、|(按位或):两个整数的补码对应的二进制位有1则为1,两个同时为0才为0,得到的数仍为补码。

举个栗子:

//|(按位或)有1为1,同为0为0
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a | b;//补码为:00000000000000000000000000000011
//所以c的值为3

三、^(按位异或):两个整数的补码对应的二进制位相同为0,相异为1,得到的数仍为补码。

举个栗子:

//^(按位异或)相同为0,相异为1
int a = 1;//    补码为:00000000000000000000000000000001
int b = 2;//    补码为:00000000000000000000000000000010
int c = a ^ b;//补码为:00000000000000000000000000000011
//所以c的值为3

位操作符的应用:

一、&(按位与)的应用:

(1)取某个二进制数的末尾:

int a = 1;//补码:00000000000000000000000000000001
int tmp1 = a & 1;//此时tmp1的值为1
int b = 2;//补码:00000000000000000000000000000010
int tmp2 = a & 1;//此时tmp2的值为0

比如某些题目要求你按位输出某个数的二进制位,那么就可以搭配移位操作符来实现:

int main()
{
  int a = 1;
  int i = 0;
  for (i = 0; i < 32; i++)
  {
    printf("%d", a & 1);
    a >>= 1;
  }
  return 0;
}

(2)令某个二进制数最右面的1消失:

int n = 1;//n的补码:00000000000000000000000000000001
n = n & (n - 1);(n-1)的补码:00000000000000000000000000000000
//结果n的补码:00000000000000000000000000000000

二、^(按位异或)的应用:

一道面试题:不创建临时变量,交换两个数。

一般想要交换两个数是这样操作的:

tmp = num2;
num2 = num1;
num1 = tmp;

如果创建临时变量的话其实还有另一种方法:

num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;

那么如何利用^ (按位异或)来实现变量交换呢,其实^(按位异或)的运算规则满足交换律,比如:

a ^ a = 0;
a ^ 0 = a;
a ^ b ^ a = b;//先运算a ^ a = 0;在运算0 ^ b = b;
//可以理解为(a ^ a) ^ b = b;

由此我们可以知道:

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

画一张图:

这种方法很巧妙,但是实用性并不高,它的效率甚至不如创建临时变量高,但是它可以让你更好的理解位操作符可能会实现一些零你意想不到的操作。

目录
相关文章
|
3天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
2月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
69 0
|
2月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
195 0
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
ly~
|
15天前
|
网络协议 算法 关系型数据库
C语言的应用
C 语言因其高效性和对硬件的直接访问能力,在多个领域有广泛应用。在系统软件领域,它被用于开发操作系统(如 Unix 和 Linux 的内核)和嵌入式系统(如汽车电子控制系统)。在游戏开发中,C 语言常用于构建游戏引擎的底层部分(如 Unity 和 Unreal Engine 的核心模块)及性能要求高的独立游戏。此外,C 语言也用于数据库管理系统(如 MySQL 和 PostgreSQL 的核心功能)和网络编程(如 TCP/IP 协议栈和网络服务器的核心模块)。
ly~
20 3
|
25天前
|
Java Unix Linux
1.3 C语言的应用范围
C语言自20世纪80年代以来一直是主流编程语言,适用于小型计算机、个人电脑及大型机。因其高效紧凑且易于修改和移植,广泛用于软件开发。尽管后来C++和JAVA流行起来,但C语言仍然是软件行业核心,并在嵌入式系统、科学编程和操作系统开发如Linux中扮演重要角色。即使到现在,掌握C语言仍是一项重要技能。不是必须得是计算机专家才能使用C语言,学习C语言同时也能学到很多C++的知识。
37 8
|
19天前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
133 1
|
17天前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
144 0
|
1月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
1月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,