C语言--第二章之位运算符

2024-04-12 22:52

本文主要是介绍C语言--第二章之位运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 基础语法

1. 位运算符

运算符术语示例结果
&按位与011 & 1012个都为1才为1,结果为001
|按位或011 & 101有1个为1就为1,结果为111
^按位异或011 ^ 101不同的为1,结果为110
~取反011100
<<左移1010 << 110100
>>右移1010 >> 10101

& 按位于运算:  都为1才为1

|  按位或运算:  只要有一个1, 结果为1

^ 按位异或运算:  相同为0, 不同为1

~ 取反运算:  1变0, 0变1

<< 左移运算:  所有位向左移动,在后面补0

>> 右移运算: 所有位向右移动(去掉最后一位)

1.1  将变量a的第二位设置为1, 其他保持不变
#include <stdio.h>
#include <inttypes.h>int main()
{uint8_t a = 0xb3;// 0xb3 -> 二进制:  0b 1011 0011// 按位或运算      0b 0000 0100  (转成十六位: 0x04)// 第二位设置为1:  0b 1011 0111  (转成十六位: 0xb7)printf("置位结果: %0x\n", 0x4); // 4// 将1左移2位printf("结果为:%0x\n", a | (1 << 2)); // b7
}
1.2 将变量b的第二位和第六位设置为1, 其他位保持不变
  
#include <stdio.h>
#include <inttypes.h>int main()
{
uint8_t b = 0xb3;// 0xb3 -> 二进制:      0b 1011 0011// 按位或运算:          0b 0100 0100 (转成十六位: 0x44)// 第二位和第六位设置1:  0b 1011 0111 (转成十六位: 0xb7)printf("%#x\n", b | 0x44); // 0xf7// 将1左移2位和六位printf("%#x\n", b | (1 << 2 | 1 << 6)); // 0xf7
}
1.3 将变量c的第五位设置为0, 其他位置保持不变
#include <stdio.h>
#include <inttypes.h>int main()
{
uint8_t c = 0xb3;// 0xb3 --> 二进制: 0b 1011 0011// 按位与运算:      0b 1101 1111  (0xdf)// 第五位设置为0:   0b 1001 0011  (0x93)printf("%#x\n", c & 0xdf);// 将1向左移动5位,并取反printf("%#x\n", c & ~(1 << 5));
}
1.4 将变量d的0-3位置于0,其他位置保持不变
#include <stdio.h>
#include <inttypes.h>int main()
{
uint8_t d = 0xff;// 0xff -> 0b 1111 1111;//         0b 1111 0000; (0xf0)//         0b 1111 0000; (0xf0)printf("%#x\n", d & 0xf0);// (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3): 0000 1111;// ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3): 1111 0000;printf("%#x~~~~~~~~~~~~\n", d & ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3));
}
1.5 将变量e的第二位取反, 其他位置保持不变
#include <stdio.h>
#include <inttypes.h>int main()
{
uint8_t e = 0b10110011; //(0xb3)// 0b 1011 0011; (0xb3)// 0b 0000 0100; (0x04)  (按位异或运算(将第二位变成1,其他为0))// 0b 1011 0111; (0xb7)printf("%#x\n", e ^ 0x04);// 5.2.将变量e的第二位取反, 其他位置保持不变uint8_t e2 = 0b10111111; // (0xbf)// 0b 1011 1111 (0xbf)// 0b 0000 0100 (0x04) //(按位异或运算(将第二位变成1,其他为0))// 0b 1011 1011 (0xbb)printf("%#x\n", e2 ^ 0x04); // 0xbb
}
1.6 将变量f取出8-15位
   #include <stdio.h>
#include <inttypes.h>int main()
{
uint32_t f = 0x12345678; // 十六进制// f 十六进制 对应32位二进制// 十六进制一个数对应二进制四位数// 与运算 0x0000ff00, 在&运算中,只有f是四个一样的1111,在&运算中,一个为1则为1// 0000 0000 0000 0000 0000 0000 0000 0000 0000printf("%#x\n", (f & 0x0000ff00) >> 8); // 0x56
}
//检查变量e的第7位是否为1,如果是则输出"Bit is set",否则输出"Bit is not set"。uint8_t e = 0b10110011;printf("s===%d\n", e & (1 << 7));if (e & (1 << 7)){printf("Bit is set\n");}else{printf("Bit is not set\n");}
总结

1. 想把某一位置为1时, 使用 | 换位运算符或者左移<< 例如:(a | 0b 0000 0100)或者(a | (1<< 2) )

2. 想把某一位设置为0时, 使用 & 换位运算符,或者左移<<并进行~取反运算符

     例如: (a & 0b 0000 1100) 或者(a & (1<<2 | 1<< 3))

3. 想把某一位取反时, 使用换位异或运算符 ^, 例如: (a ^ 0b 0000 0100)

4. 想取出某一位时, 使用&运算符右移>>, 这里注意: 数据位数32时,十六进制对应二进制的四位,  例如: 取出32位的8-15位时((a & 0x0000ff00) >> 8), 取出8位的第七位时, (e & (1 << 7))

1 ---- |   或者 >>

0 ---- &  或者 >>

取反 ---- ^

取出 ---- & >> 

这篇关于C语言--第二章之位运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898467

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据