C# 对位的操作
需求 一个byte 中第0-4位分别代表不同的业务,一个byte是8位,怎么读取和设置位
设置位
设置Byte 中的位,00000000,对于位只有0 和 1 ,这个是组合方式
设置值到位里面,思路就是先找到具体的位通过左移,
//处理日志等级
byte levRes =0;
if (ErrLevel == true)
{
// 第0位左移1位
byte errValue= 1 << 0;
levRes = (byte)(levRes + errValue);
}
if (CenterLevel == true)
{
// 第1位左移1位
byte cValue = 1 << 1;
levRes = (byte)(levRes + cValue);
}
if (WarmLevel == true)
{
// 第2位左移1位
byte warnValue = 1 << 2;
levRes = (byte)(levRes + warnValue);
}
if (InfoLevel == true)
{
byte infoValue = 1 << 3;
levRes = (byte)(levRes + infoValue);
}
if (DebugLevel == true)
{
byte debugValue = 1 << 4;
levRes = (byte)(levRes + debugValue);
}
读取位
读取 从一个byte 中读取每一个位是否为1 ,一个byte 有8个位 先通过左移找到这个位,然后和原来的byte& 就可以知道当前位是否是1 // 日志等级 for (int i = 0; i <= 7; i++) { // 定位到第几位 byte val = (byte)(1 << i); // 第几位与原始&可以知道当前是否 bool isvaluie = (val & logLeverl) != 0; if (i == 0 && isvaluie) { ErrLevel = true; } else if (i == 1 && isvaluie) { CenterLevel = true; } else if(i == 2 && isvaluie) { WarmLevel = true; } else if (i == 3 && isvaluie) { InfoLevel = true; } else if(i == 4 && isvaluie) { DebugLevel = true; } }
备注: 如果你要对int 设置位,一样的逻辑
int a = 0b111111;
Console.WriteLine(a);
// 10进制 转成 2 8 16
int sum = 160;
Debug.WriteLine(Convert.ToString(sum, 2));
Debug.WriteLine(Convert.ToString(sum, 8));
Debug.WriteLine(Convert.ToString(sum, 16));
// 2 8 16 转成10进制
Debug.WriteLine(Convert.ToInt32("11", 2));
Debug.WriteLine(Convert.ToInt32("11", 8));
Debug.WriteLine(Convert.ToInt32("11", 16));

浙公网安备 33010602011771号