逻辑运算符
运算结果只能是true或false
&&:逻辑与,同真才真,一假则假,例:账号登陆:账号正确&&密码正确
|| :逻辑或,一真则真,全假才假
! :逻辑非,对表达式的结果取反,例:切换战斗状态
注:只能同类型相比,如果拿int和bool类型比,则报错
三目运算符(表达式1?表达式2:表达式3)
可以用来表示程序分支,简化if-else语句
如果表达式1结果是true,则运行表达式2;如果表达式1为false,则运行表达式3
进制转换
二进制转十进制:低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。
十进制转二进制:除2取余法,一直除到0,然后从下往上的书序
位运算符
位运算一定是针对二进制的,两个数再进行位运算时先转成二进制再进行计算
按位与(&)
运算规则:两个数的同一位同时为1结果为1
8 & 9 = 0000 1000 & 0000 1001 = 0000 1000 = 8
按位或(|)
运算规则:两个数的同一位只要有一个为1结果为1
8 | 9 = 0000 1000 | 0000 1001 = 0000 1001 = 9
按位异或(^)
运算规则:两个数的同一位相同结果为0,不同结果为1
8 ^ 9 = 0000 1000 ^ 0000 1001 = 0000 0001 = 1
按位非(~)
运算规则:将当前数的每一位按位进行取反,0变成1,1变成0
~1 = ~0000 0001 = 1111 1110
左移运算符<<
运算规则:将当前数的每一位向左移动,不够以0补。如:
1.1 << 3 = 0000 0001 << 3 = 0000 1000 = 8 即 1<<3 相当于 1*2^3
2.3 << 3 = 0000 0011 << 2 = 0000 1100 = 12 即 3<<2 相当于 3*2^2
右移运算符>>
运算规则:将当前数的每一位向右移动,不够以0补
1.8 >> 2 = 0000 1000 >> 2 = 0000 0010 = 2
2.12 >> 3 = 0000 1100 >> 3 = 0000 0001 = 1
位运算符应用--buff
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 按位运算 { class Program { static void Main(string[] args) { #region 位移 //int a = 3 << 1; //Console.WriteLine(a); #endregion #region 添加buff const int _speed_up = 1; //加速 0000 0001 const int _attck = 1 << 1; //物攻 0000 0010 const int _dodge = 1 << 2; //闪避 0000 0100 const int _magic = 1 << 3; //法强 0000 1000 const int _def = 1 << 4; //防御 0001 0000 //定义buff int buff=0; //加物攻BUFF buff |= _attck; // 按位或 两个数同位上的数值有一个为1则为1 //buff 0000 0000 //_attck 0000 0010 //运算 0000 0010 _attck第1位有1 所以运算后的结果第1位上的数是1 buff |= _magic; //buff 0000 0010 //_magic 0000 1000 //结果 0000 1010 //判断是否加上buff; string isAtk = (buff&_attck)==_attck?"有攻击buff":"无攻击buff"; // 按位与 两个数同位上的数值全部是1才为1,否则为0 //_attck 0000 0010 //buff 0000 1010 //buff&_attck 0000 0010 buff第3位是1 _attck第3位是0 所以运算结果第3位是0 buff第1位是1 _attck第1位也是1 所以结果第1位是1 Console.WriteLine(isAtk); //消除物攻buff buff ^= _attck; //按位异或 两个数同位上的数值相同位0 不同时为1 //buff 0000 1010 //_attck 0000 0010 //运算 0000 1000 buff第3位是1 _attck第3位是0 所以运算后结果第3位是1 buff第1位是1 _attck第1位也是1 同位数值相同为0 所以结果第1位是0 达到消除_attck的效果 //判断是否加上buff; isAtk = (buff & _attck) == _attck ? "有攻击buff" : "无攻击buff"; Console.WriteLine(isAtk); #endregion Console.ReadKey(); } } }
结果
判断语句
如果语句块中只有一句话,那么可以省略大括号
1.if语句
Console.WriteLine("请输入你今天的学习时间"); int stuTime = int.Parse(Console.ReadLine()); if (stuTime>60) { Console.WriteLine("今天看学习资料花了{0}分钟,你很努力呦",stuTime); //如果if括号里面的表达式成立 则会执行这个代码块的代码 } Console.WriteLine("继续学习吧,骚年"); //如果if括号里面的表达式不成立 则会跳过上面代码块直接执行这句代码
2.if-else
Console.WriteLine("请输入一个整数"); int num = int.Parse(Console.ReadLine()); if (num % 2 ==0) { Console.WriteLine("Your input is even"); // 如果num%2结果为0 则执行此句 } else { Console.WriteLine("Your input is odd"); // 如果num%2结果不为0 则执行此句 }
3.if-else-if
如果条件不止一个标准的话,则可以在else后面再加一个条件
注意:if/else if /else 是并列关系,只能执行其中一个,执行完则跳出整个判断语句
string user = "admin"; string pwd = "88888"; Console.WriteLine("请输入用户名"); string username = Console.ReadLine(); Console.WriteLine("请输入密码"); string password2 = Console.ReadLine(); if (username==user&&password2==pwd) { Console.WriteLine("密码正确,登录成功!"); } else if(username!=user) { Console.WriteLine("用户名不存在"); } else { Console.WriteLine("密码错误"); }