0

0

C# 位运算操作方法 C#如何使用与、或、异或运算符

星降

星降

发布时间:2026-03-02 11:13:35

|

786人浏览过

|

来源于php中文网

原创

位运算符(&、|、^)对整数二进制位独立运算,常用于标志位检查(如access & fileaccess.read)、设置(|=)、翻转(^=);需注意优先级、负数补码、类型提升及与逻辑运算符区别。

c# 位运算操作方法 c#如何使用与、或、异或运算符

位运算符在 C# 中的语法和基本行为

与(&)、或(|)、异或(^)在 C# 中是二元操作符,对整数类型的每一位独立运算。它们不关心数值含义,只看二进制表示——比如 5 & 3 实际计算的是 101 & 011 → 001,结果为 1

注意:这些操作符有重载版本,但对 intuintlong 等内置整型直接生效;对 bool 也支持(此时是逻辑运算,非位运算),别混淆。

常见错误现象:
- 把 && 写成 & 用于布尔判断,导致意外的位运算而非短路逻辑
- 对负数做位运算时没意识到补码表示,比如 -1 | 0xFF 结果仍是 -1(因为 -1 全是 1)

& 检查标志位是否开启(最常用场景)

这是位运算最典型的用途:把整数当一组开关用,每个 bit 表示一个布尔状态。例如 Windows API 或 .NET 的枚举常配合 [Flags] 特性:

[Flags]
enum FileAccess {
    Read = 1,      // 0001
    Write = 2,     // 0010
    Execute = 4,   // 0100
    Delete = 8     // 1000
}

判断某个权限是否存在,必须用 &,不能用 ==

  • if ((access & FileAccess.Read) == FileAccess.Read) ✅ 正确
  • if (access & FileAccess.Read) ❌ 危险:非零即真,但若 accessRead | Write(值为 3),该表达式仍为真,但语义模糊
  • if (access == FileAccess.Read) ❌ 错误:忽略了组合权限

|^ 设置或翻转标志位

| 是“开启”某位,^ 是“翻转”某位,两者都常用于无副作用地修改权限集合:

Reachout.ai
Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

下载
  • 添加权限:access |= FileAccess.Write
  • 移除权限(需配合 ~):access &= ~FileAccess.Execute —— 注意不是直接用 ^,否则会误翻其他位
  • 切换权限(开变关、关变开):access ^= FileAccess.Delete

性能影响:这些操作都是 CPU 原生指令,比方法调用或集合操作快得多,适合高频路径(如网络协议解析、图像像素处理)。

兼容性注意:bytesbyte 参与位运算时会自动提升为 int,所以 (byte)5 & (byte)3 实际执行的是 5 & 3,结果是 int 类型,需要显式转换才能赋给 byte 变量。

容易被忽略的细节:运算符优先级和括号

位运算符优先级低于比较运算符(如 ==!=),高于赋值(=),但远低于算术运算符。这导致很多隐蔽 bug:

  • if (x & 7 == 0) 等价于 if (x & (7 == 0)) → 永远是 if (x & 0) → 永远假
  • 正确写法必须加括号:if ((x & 7) == 0)
  • 复合赋值如 x ^= y + 1 等价于 x = x ^ (y + 1),加法先算,没问题;但 x = x ^ y + 1 就不对,因为 ^ 优先级低于 +

建议:只要涉及混合运算,一律加括号;长期习惯后,能避免 90% 的位运算相关逻辑错误。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

240

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

838

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

595

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

43

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号