十进制左移右移以及IO输出处理记录
左移右移:
static void Main(string[] args)
{
int testNum = 90;
int index = 4;
//10000 将1左移四位 得到16
int res = 1 << index;
//index=4 0100 就是4向右移2位 0001
res = index >> 2;
int res1 = 1 << index;
//&与运算 res1和0与,都为1则为1
res1 = 0 & res1;
res1 = 1 << index;
//^或运算 有1为1 res1=10000 ^ 0010=10010=18
res1 = 2 ^ res1;
}
<<左移 例如:10010<<3 相当于整体往前前移三位 10010000
>>右移 例如:10010>>3 相当于后面三位右移后将舍弃变成00010
&与运算,和&&类似,全为1则为1
原理:&
是按位与运算符,用于对两个整数类型(如int
、long
等)的操作数进行按位与操作。它会对两个操作数的每一位按照二进制形式进行逻辑与操作。具体规则是:当对应位上两个数字都为1
时,该位结果为1
;否则,该位结果为0
&&逻辑与运算:
原理:&&
是逻辑与运算符,用于对两个布尔类型的操作数进行逻辑与操作。它会判断两个操作数是否都为true
,如果是,则整个表达式的结果为true
;只要有一个操作数为false
,整个表达式的结果就为false
。并且,&&
运算符具有短路特性,即当第一个操作数为false
时,不会再计算第二个操作数,因为无论第二个操作数是什么,整个表达式的结果都已经确定为false
了。
对输出IO的算法:
internal void SetIO(short index,bool IsON)
{
lock (_lockUpdateIO)
{
try
{
if (Connect.IsConnected)
{
short _con = 4;
//short indexb = (short)(index + _con);
int nowresult = Out_GetAll();
//比如当前index=4 是第四个IO输出 将1左移4位=10000 然后与当前已经输出的Out做与运算,都是1则为1 即,如果该输出已经输出为1了,再次输出的时候,只有设置为false的情况才能做移位计算工作
// 否则如果小于0 则代表当前该IO输出是false 则不进行操作,只有ISON=true的时候,才进行移位操作。
if((nowresult & (1 << index)) > 0)
{
if (IsON == false)
{
nowresult = nowresult ^ (1 << index);
}
}
else
{
if(IsON)
{
nowresult = nowresult ^ (1 << index);
}
}
//要用Ushort类型 如果用short类型的话,32768再读出来会等于-32767 用Ushort则不会
Connect.PreSetMultiReg(_con, GetUShortArray(nowresult.ToString()));
}
// Connect.Send(result2.ToString());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
思路:先要判断该输出是否已经输出为true,如果是的话,只做该输出的 false运算。如果该输出为false的话,则只对该输出做true的运算。不要做重复操作。
Short与Ushort的区别:
short
:short
是有符号短整型,在 C# 中它占用 2 个字节(16 位)。因为它是有符号的,所以可以表示正数和负数。其取值范围是从 - 32,768(即 )到 32,767(即)。这是因为最高位用于表示符号(0 表示正数,1 表示负数),剩下的 15 位用于表示数值大小。
ushort
:ushort
是无符号短整型,同样占用 2 个字节(16 位)。由于它是无符号的,只能表示非负数,所以其取值范围是从 0 到 65,535(即)。所有的 16 位都用于表示数值大小。