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语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi