位运算

  1. 位运算简介

    • 位运算是对整数在二进制层面上进行的运算。在 C# 中,位运算直接操作整数类型(如intbyteshortlong等)的二进制位。
  2. 常见位运算符

按位与(&)

  • 规则:对两个操作数的每一位进行比较,如果两个对应位都为 1,则结果位为 1,否则为 0。
int a = 5; // 二进制: 00000101
int b = 3; // 二进制: 00000011
int result = a & b; 
// 计算过程:
// 00000101
// & 00000011
// -------
// 00000001
// 结果为1
Console.WriteLine(result); 

按位或(|)

  • 规则:对两个操作数的每一位进行比较,如果两个对应位中有一个为 1,则结果位为 1,只有当两个对应位都为 0 时,结果位才为 0。
int a = 5; // 二进制: 00000101
int b = 3; // 二进制: 00000011
int result = a | b; 
// 计算过程:
// 00000101
// | 00000011
// -------
// 00000111
// 结果为7
Console.WriteLine(result); 

按位异或(^)

  • 规则:对两个操作数的每一位进行比较,如果两个对应位不同(一个为 0,另一个为 1),则结果位为 1,否则为 0。
int a = 5; // 二进制: 00000101
int b = 3; // 二进制: 00000011
int result = a ^ b; 
// 计算过程:
// 00000101
// ^ 00000011
// -------
// 00000110
// 结果为6
Console.WriteLine(result); 

按位取反(~)

  • 规则:对操作数的-每一位进行取反,0 变 1,1 变 0。
  • 快速计算方法 ~8=-8-1=-8,  ~-8=-(-8)-1=7 原数的相反数减一
int a = 5; // 二进制: 00000101
int result = ~a; 
// 计算过程:
// 00000101
// ~ ------
// 11111010
// 在有符号整数中,这是 -6 的补码表示
Console.WriteLine(result); 

左移(<<)

  • 规则:将操作数的二进制位向左移动指定的位数,右边空出的位用 0 填充。
int a = 5; // 二进制: 00000101
int result = a << 2; 
// 计算过程:
// 00000101 左移2位
// ------
// 00010100
// 结果为20
Console.WriteLine(result); 

右移(>>)

  • 规则:将操作数的二进制位向右移动指定的位数。对于有符号整数,若为正数,左边空出的位用 0 填充;若为负数,左边空出的位用 1 填充。对于无符号整数,左边空出的位始终用 0 填充。
  • 示例(有符号整数,正数)
int a = 20; // 二进制: 00010100
int result = a >> 2; 
// 计算过程:
// 00010100 右移2位
// ------
// 00000101
// 结果为5
Console.WriteLine(result); 
  • 示例(有符号整数,负数)
int a = -20; // 二进制补码: 11101100
int result = a >> 2; 
// 计算过程:
// 11101100 右移2位
// ------
// 11111011
// 结果为 -5
Console.WriteLine(result); 

流程控制

  1. if 条件判断

基本 if 语句

  • 语法if (条件表达式) { 语句块; }
  • 解释:条件表达式的结果必须是布尔值(truefalse)。如果条件表达式的值为 true,则执行大括号内的语句块;如果为 false,则跳过该语句块。
int num = 10;
if (num > 5)
{
    Console.WriteLine("数字大于5");
}

if - else 语句

  • 语法if (条件表达式) { 语句块1; } else { 语句块2; }
  • 解释:如果条件表达式为 true,执行语句块 1;否则执行语句块 2。
int num = 3;
if (num > 5)
{
    Console.WriteLine("数字大于5");
}
else
{
    Console.WriteLine("数字小于或等于5");
}

if - else if - else 语句

if (a > b)
{
    // 满足条件执行
    Console.WriteLine("a > b");
}
else if (a < b)
{
    // 不满足上一个条件,满足这个条件,执行此处
    Console.WriteLine("a < b");
}
else
{
    // 以上条件都不满足时执行
    Console.WriteLine("a = b");
}

//解释:依次判断条件表达式 1、条件表达式 2 等。

//如果条件表达式 1 为 true,执行语句块 1;

//如果条件表达式 1 为 false 且条件表达式 2 为 true,执行语句块 2;

//如果所有条件表达式都为 false,执行语句块 3。

eg:

int score = 75;
if (score >= 90)
{
    Console.WriteLine("成绩等级为A");
}
else if (score >= 80)
{
    Console.WriteLine("成绩等级为B");
}
else if (score >= 70)
{
    Console.WriteLine("成绩等级为C");
}
else
{
    Console.WriteLine("成绩等级为D");
}

分支语句嵌套

可进行多层判断,提升代码健壮性。需要先满足一个条件,再进行另一个条件的判断

eg:


int age = 110;
if (age >= 0 & age <= 120)
{
    Console.WriteLine("年龄合法");
    if (age >= 18)
    {
        Console.WriteLine("成年人!");
    }
    else
    {
        Console.WriteLine("未成年人!");
    }
}
else
{
    Console.WriteLine("年龄不合法");
}

switch 语句

switch (表达式)//首先计算 switch 后面括号内的表达式的值。
{
    case 值1: //将该值与各个 case 后的常量值进行比较。
        语句块1; //如果找到匹配的值,就执行对应的语句块,直到遇到 break 语句
        break; //break 语句用于跳出 switch 语句。
    case 值2:
        语句块2;
        break;
    default:  //如果没有任何 case 常量值与表达式的值匹配,则执行 default 后面的语句块
        语句块3;
        break;
}
//default 部分是可选的,如果没有 default 且没有匹配的 case,则 switch 语句不执行任何操作)。

int dayOfWeek = 3;
switch (dayOfWeek)
{
    case 1:
        Console.WriteLine("星期一");
        break;
    case 2:
        Console.WriteLine("星期二");
        break;
    case 3:
        Console.WriteLine("星期三");
        break;
    case 4:
        Console.WriteLine("星期四");
        break;
    case 5:
        Console.WriteLine("星期五");
        break;
    case 6:
        Console.WriteLine("星期六");
        break;
    case 7:
        Console.WriteLine("星期日");
        break;
    default:
        Console.WriteLine("无效的星期几数值");
        break;
}

if - elseswitch 的比较

  • 适用场景
    • if - else:适用于各种复杂条件的判断,条件可以是任何布尔表达式,比如比较两个变量、判断字符串是否包含某个子串等。例如,判断一个数是否在某个范围内,if (num >= 10 && num <= 20)
    • switch:适用于根据一个变量的值进行多路分支,且变量类型通常为整数、字符、枚举等,并且 case 后的常量值是明确且有限的。例如,根据枚举类型的值来执行不同操作。
  • 可读性和性能
    • if - else:当条件判断逻辑复杂且条件表达式多样时,if - else 更灵活,但过多嵌套可能导致代码可读性下降。
    • switch:对于多路分支且条件值明确的情况,switch 语句使代码结构更清晰,可读性更好。在某些情况下,switch 的性能可能略优于复杂的 if - else 嵌套(例如,当 case 数量较多且分布均匀时,编译器可能对 switch 进行更优化的处理)。

更多推荐