【从零开始入门unity游戏开发之——C#篇08】逻辑运算符、位运算符

文章目录

一、逻辑运算符

逻辑运算符优先级低于条件运算符算术运算

多个逻辑与组合运用,在没有括号的情况下,从左到右依次看即可。有括号先看括号内

1、&&(逻辑与)

用法: && 运算符用于检查两个条件是否都为 true。只有当两个条件都为 true 时,整个表达式才为 true,否则为 false。

规侧: 对两个bool值进行逻辑运算有假侧假同真为真

语法:

csharp 复制代码
条件1 && 条件2

示例:

csharp 复制代码
bool a = true;
bool b = false;
bool result = a && b;  // false,因为 b 是 false
Console.WriteLine(result);  // 输出: false

2、||(逻辑或)

用法: || 运算符用于检查两个条件中至少有一个为 true。如果任意一个条件为 true,整个表达式就为 true,只有两个条件都为 false 时,结果才为 false。

规侧:对两个bool值进行逻辑运算有真则真同假为假

语法:

csharp 复制代码
条件1 || 条件2

示例:

csharp 复制代码
bool a = true;
bool b = false;
bool result = a || b;  // true,因为 a 是 true
Console.WriteLine(result);  // 输出: true

3、!(逻辑非)

用法: ! 运算符用于反转布尔值。它将 true 转换为 false,将 false 转换为 true。

规则:对一个bool值进行取反,真变假,假变真

语法:

csharp 复制代码
!条件

示例:

csharp 复制代码
bool a = true;
bool result = !a;  // false,因为 a 是 true,!a 就是 false
Console.WriteLine(result);  // 输出: false

4、^(逻辑异或)

用法: ^ 运算符用于检查两个条件是否相异。当两个条件的值不同(即一个为 true,另一个为 false)时,结果为 true;当两个条件相同(都为 true 或都为 false)时,结果为 false。

语法:

csharp 复制代码
条件1 ^ 条件2

示例:

csharp 复制代码
bool a = true;
bool b = false;
bool result = a ^ b;  // true,因为 a 和 b 不相同
Console.WriteLine(result);  // 输出: true

5、短路运算

C# 中的 && 和 || 运算符是短路运算符。这意味着:

  • 对于 && 运算符,如果第一个条件为 false,则第二个条件不再被检查,因为无论第二个条件是什么,结果都会是 false。
  • 对于 || 运算符,如果第一个条件为 true,则第二个条件不再被检查,因为无论第二个条件是什么,结果都会是 true。

示例:

csharp 复制代码
bool a = false;
bool b = true;
bool result = a && b;  // false, 不检查 b 的值,因为 a 已经是 false
Console.WriteLine(result);  // 输出: false

6、结合使用逻辑运算符

你可以将多个逻辑运算符组合使用,来处理更复杂的条件表达式。

!(逻辑非)优先级最高,&&(逻辑与)优先级高于||(逻辑或)

逻辑运算符优先级低于算数运算符、条件运算符(逻辑非除外)

示例:

csharp 复制代码
bool a = true;
bool b = false;
bool c = true;

bool result = (a || b) && c;  // (true || false) && true -> true && true -> true
Console.WriteLine(result);  // 输出: true

7、总结

C# 中的逻辑运算符帮助你进行条件判断、控制程序流。以下是常见的运算符总结:

  • &&(逻辑与):两个条件都为 true 时结果为 true。
  • ||(逻辑或):至少有一个条件为 true 时结果为 true。
  • !(逻辑非):反转布尔值。
  • ^(逻辑异或):两个条件不同为 true,相同为 false。

二、位运算符

位运算符是操作整数类型(如 int, long, short 等)中各个二进制位的运算符。

位运算符主要用数值类型进行计算的,将数值转换为2进制再进行位运算

多个数值进行位运算,没有括号时,从左到右依次计算

1、按位与(&)

功能: 对两个操作数的每一位进行"与"运算。只有两个对应的位都为 1 时,结果位才为 1;否则结果位为 0。

有0则0

语法:

csharp 复制代码
a & b

示例:

csharp 复制代码
int a = 5;  // 二进制: 0101
int b = 3;  // 二进制: 0011
int result = a & b;  // 结果: 1, 二进制: 0001
Console.WriteLine(result);  // 输出: 1

2、按位或(|)

功能: 对两个操作数的每一位进行"或"运算。只要两个对应的位中有一个为 1,结果位就为 1,只有两个位都为 0 时,结果位才为 0。

有1则1

语法:

csharp 复制代码
a | b

示例:

csharp 复制代码
int a = 5;  // 二进制: 0101
int b = 3;  // 二进制: 0011
int result = a | b;  // 结果: 7, 二进制: 0111
Console.WriteLine(result);  // 输出: 7

3、按位异或(^)

功能: 对两个操作数的每一位进行"异或"运算。当两个位相同(都为 0 或都为 1)时,结果为 0;当两个位不同(一个为 0,另一个为 1)时,结果为 1。

相同为0, 不同为1

语法:

csharp 复制代码
a ^ b

示例:

csharp 复制代码
int a = 5;  // 二进制: 0101
int b = 3;  // 二进制: 0011
int result = a ^ b;  // 结果: 6, 二进制: 0110
Console.WriteLine(result);  // 输出: 6

4、按位取反(~)

功能: 对操作数的每一位进行"取反"运算。即 0 变为 1,1 变为 0。

0变1, 1变0

语法:

csharp 复制代码
~a

示例:

csharp 复制代码
int a = 5;  // 二进制: 0101
int result = ~a;  // 结果: -6, 二进制: 1010(在二进制补码表示中)
Console.WriteLine(result);  // 输出: -6

说明: 取反会将整数转换为其补码表示,导致负数结果。

5、左移(<<)

功能: 将二进制位向左移动指定的位数。左移几位 右侧补0。

语法:

csharp 复制代码
a << n

n 是你希望左移的位数。

示例:

csharp 复制代码
int a = 5; //二进制为101
int c = a << 5;
//就是将a的二进制向左移动5位,右侧补0
//移动1位 1010
//移动2位 10100
//移动3位 101000
//移动4位 1010000
//移动5位 10100000 => 转10进制 = 160
Console.WriteLine(c);//输出160

6、右移(>>)

功能: 将二进制位向右移动指定的位数。右移几位,右侧去掉几个数。

语法:

csharp 复制代码
a >> n

n 是你希望右移的位数。

示例:

csharp 复制代码
int b = 5; //101
int d = b >> 2;
//就是将b的二进制向右移动2位,左侧补符号位
//移动1位 10
//移动2位 1
Console.WriteLine(d);//输出1

7、组合位运算符

位运算符可以组合使用来解决更复杂的问题。常见的做法是通过位运算来设置、清除或切换某一位。

设置某一位为 1:

csharp 复制代码
int a = 5;  // 二进制: 0101
int result = a | (1 << 2);  // 设置第3位为1, 结果: 7, 二进制: 0111
Console.WriteLine(result);  // 输出: 7

清除某一位为 0:

csharp 复制代码
int a = 5;  // 二进制: 0101
int result = a & ~(1 << 2);  // 清除第3位为0, 结果: 1, 二进制: 0001
Console.WriteLine(result);  // 输出: 1

切换某一位:

csharp 复制代码
int a = 5;  // 二进制: 0101
int result = a ^ (1 << 2);  // 切换第3位, 结果: 1, 二进制: 0001
Console.WriteLine(result);  // 输出: 1

8、位运算应用

位运算在以下场景中非常有用:

  • 权限管理: 利用位掩码(bitmask)管理不同的权限。
  • 检查奇偶: 通过位与操作检查一个数字是奇数还是偶数。
  • 高效的计算: 位移运算比乘除法运算更高效,适合用在性能要求较高的应用中。

示例:检查一个数是否为偶数

csharp 复制代码
int a = 6;
bool isEven = (a & 1) == 0;  // 如果最后一位是0,则为偶数
Console.WriteLine(isEven);  // 输出: True

9、总结

位运算符在 C# 中非常强大,它们主要用于二进制位的操作。常见的位运算符有:

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

专栏推荐

地址
【从零开始入门unity游戏开发之------C#篇】
【从零开始入门unity游戏开发之------unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关推荐
czq_26867194874 小时前
Python打卡第46天
开发语言·python
卸任4 小时前
Vibe coding工具使用心得
前端·ai编程
brien94 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance5 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M5 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写5 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李5 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易5 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马5 小时前
前沿视界
前端
kyriewen5 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员