【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;

画一张图:

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

目录
相关文章
|
2月前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
73 4
|
10天前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
49 8
|
10天前
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
43 7
|
13天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
32 5
|
13天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
12天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
29 1
|
12天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
36 1
|
13天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
23 2
|
17天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
17天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。