当前位置: 首页 > news >正文

学懂C语言(十): C语言位运算符(按位与、按位或、左移、右移、异或、取反)的计算过程和底层原理

C语言的位运算符用于直接操作整数的二进制位,具有高效的计算性能和底层操作能力。以下将介绍常用的位运算符及其计算过程和底层原理。

1. 位运算符介绍

C语言中的位运算符主要包括:

  • 按位与(&
  • 按位或(|
  • 按位异或(^
  • 按位取反(~
  • 左移(<<
  • 右移(>>

2. 位运算符的计算过程

2.1 按位与(&

操作:逐位比较两个数的二进制表示,只有当两个对应位都为1时,结果才为1,否则为0。

示例

int a = 12; // 二进制:1100
int b = 5;  // 二进制:0101
int result = a & b; // 运算过程: 1100 & 0101 = 0100 (4)

2.2 按位或(|

操作:逐位比较两个数的二进制表示,只要有一个对应位为1,结果就为1。

示例

int a = 12; // 二进制:1100
int b = 5;  // 二进制:0101
int result = a | b; // 运算过程: 1100 | 0101 = 1101 (13)

2.3 按位异或(^

操作:逐位比较两个数的二进制表示,当对应位不同(一个为1,另一个为0)时,结果为1;相同则为0。

示例

int a = 12; // 二进制:1100
int b = 5;  // 二进制:0101
int result = a ^ b; // 运算过程: 1100 ^ 0101 = 1001 (9)

2.4 按位取反(~

操作:逐位反转一个数的二进制表示,0变为1,1变为0。

示例

int a = 12; // 二进制:0000 1100
int result = ~a; // 运算过程:反转后为 1111 0011 (-13)

注意:结果是一个负数,其值取决于整数的表示(通常为补码)。

2.5 左移(<<

操作:将操作数的二进制位向左移动指定数量的位,低位补0,相当于乘以2的n次方(n为移动的位数)。

示例

int a = 3; // 二进制:0000 0011
int result = a << 2; // 运算过程: 0000 1100 (12)

2.6 右移(>>

操作:将操作数的二进制位向右移动指定数量的位,符号位处理不同,若是无符号数高位补0,若是有符号数则复制符号位(算术右移)。

示例

int a = 12; // 二进制:0000 1100
int result = a >> 2; // 运算过程: 0000 0011 (3)

3. 底层原理

位运算在计算机中是以二进制方式直接操作的,底层原理涉及到计算机的位存储方式和位操作电路。具体来说:

  • 存储方式:计算机内存中的数据以二进制形式存储,每个位(bit)都可以是0或1。
  • 运算实现:逻辑运算器(如AND、OR、XOR电路)在硬件层面实现位运算,速度非常快。
  • 补码表示:负数在计算机中通常采用补码表示法,这使得位运算特别适合于处理负数。

4. 使用注意事项

  • 位运算仅适用于整型数据(如intunsigned intchar等)。
  • 在进行位运算时,要注意数据类型的范围,避免溢出。
  • 移位操作可能会导致数据的丢失,特别是当移位超出数据类型的位数时。

总结

        C语言的位运算符提供了直接操作二进制位的能力,能够高效地实现许多算法和操作。理解这些运算符的计算过程及底层原理,可以帮助程序员在低级别上优化代码和提升性能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue使用audio 音频实现播放与关闭(可用于收到消息给提示音效)
  • 4.基础知识-数据库技术基础
  • 河南萌新联赛2024第(一)场:河南农业大学
  • kafka---消息日志详解
  • 【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树
  • PyTorch Tabular:高效优化结构化数据处理的强大工具
  • 达梦数据库系列—29. DTS迁移ORACLE到DM
  • C++多线程编程中的锁详解
  • 并发编程面试题1
  • 在C#中,如何优化对象的创建和销毁以提高性能?
  • c# excel转pdf
  • 16QAM实验报告【附全部MATLAB代码】
  • 高阶面试-hw算法整理
  • 2013年全国大学生数学建模竞赛B题碎纸片复原(含word论文和源代码资源)
  • Python PDF Magic:合并和拆分随心所欲
  • JavaScript-如何实现克隆(clone)函数
  • (三)从jvm层面了解线程的启动和停止
  • .pyc 想到的一些问题
  • chrome扩展demo1-小时钟
  • EventListener原理
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTTP中GET与POST的区别 99%的错误认识
  • Mysql优化
  • Rancher如何对接Ceph-RBD块存储
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue脚手架vue-cli
  • win10下安装mysql5.7
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 番外篇1:在Windows环境下安装JDK
  • 回顾 Swift 多平台移植进度 #2
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 深入浅出Node.js
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 为视图添加丝滑的水波纹
  • 正则学习笔记
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #pragma once与条件编译
  • (苍穹外卖)day03菜品管理
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (轉)JSON.stringify 语法实例讲解
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .ai域名是什么后缀?
  • .Net core 6.0 升8.0
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core中Quartz的使用方法
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net mvc部分视图
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • @vue/cli 3.x+引入jQuery