高分求解 利用一个字节的8个bit,怎么保存版本号信息

yesbar 2010-12-30 09:07:10
一个字节中,有8个Bit位分别是7 6 5 4 3 2 1 0
我想在这个字节中保存 X1.X2.X3,例如 1.0.3 表示版本号 为Ver1.0.3
其中其中bit7、bit6、bit5 用来存储数字X1,bit4和bit3用来存储数字X2,bit2、bit1、bit0用来存储数字X3

怎么做到给定版本号,即可构建这个字节byte??


我用程序怎么写?


...全文
161 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabbitlzx 2010-12-31
  • 打赏
  • 举报
回复
3个bit最多只能表示7,如果最后一位版本号变成8就表示不了了阿
兔子-顾问 2010-12-31
  • 打赏
  • 举报
回复
一个字节中,有8个Bit位分别是7 6 5 4 3 2 1 0
我想在这个字节中保存 X1.X2.X3,例如 1.0.3 表示版本号 为Ver1.0.3
其中其中bit7、bit6、bit5 用来存储数字X1,bit4和bit3用来存储数字X2,bit2、bit1、bit0用来存储数字X3

怎么做到给定版本号,即可构建这个字节byte??

----------------------------
bit是位,2进制中一个位只能是0或是1,
1.0.3
这里.分割的三个数字都每个是一个字节才可以。否则不可能用一个位表示3.
jcx396158820 2010-12-31
  • 打赏
  • 举报
回复
楼上正解。。。
烈火蜓蜻 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 yesbar 的回复:]
一个字节中,有8个Bit位分别是7 6 5 4 3 2 1 0
我想在这个字节中保存 X1.X2.X3,例如 1.0.3 表示版本号 为Ver1.0.3
其中其中bit7、bit6、bit5 用来存储数字X1,bit4和bit3用来存储数字X2,bit2、bit1、bit0用来存储数字X3

怎么做到给定版本号,即可构建这个字节byte??


我用程序怎么写?
[/Quote]

byte ver = 0;
ver |= (X1 & 0x07 << 5 );
ver |= (X2 & 0x03 << 3 );
ver |= (X2 & 0x07 );

这样就可以实现你的要求了
wolftop 2010-12-30
  • 打赏
  • 举报
回复
/// <summary>
/// 获取数据中某一位的值
/// </summary>
/// <param name="input">传入的数据类型,可换成其它数据类型,比如Int</param>
/// <param name="index">要获取的第几位的序号,从0开始</param>
/// <returns>返回值为-1表示获取值失败</returns>
private int GetbitValue(byte input,int index)
{
if (index > sizeof(byte))
{
return -1;
}
//左移到最高位
int value = input << (sizeof(byte) - 1 - index);
//右移到最低位
value = value >> (sizeof(byte) - 1);
return value;
}


/// <summary>
/// 设置某一位的值
/// </summary>
/// <param name="data"></param>
/// <param name="index">要设置的位, 值从低到高为 1-8</param>
/// <param name="flag">要设置的值 true / false</param>
/// <returns></returns>
byte set_bit(byte data, int index, bool flag)
{
if (index > 8 || index < 1)
throw new ArgumentOutOfRangeException();
int v = index < 2 ? index : (2 << (index - 2));
return flag ? (byte)(data | v) : (byte)(data & ~v);
}
sxldfang 2010-12-30
  • 打赏
  • 举报
回复
测试运行没问题,注意数据大小,别太大


private byte getBB(string bb)
{
//string bb = "Ver3.2.6";
Match m = Regex.Match(bb, @"(?i)ver(?<n1>\d+)\.(?<n2>\d+)\.(?<n3>\d+)");
byte b = 0;
if (m.Success)
{
byte b1 = byte.Parse(m.Groups["n1"].Value);
byte b2 = byte.Parse(m.Groups["n2"].Value);
byte b3 = byte.Parse(m.Groups["n3"].Value);
b = (byte)((b1 << 5) | (b2 << 3) | b3);
}
return b;
}

yesbar 2010-12-30
  • 打赏
  • 举报
回复
x1(0~7) x2(0~3) X3(0~7)
sxldfang 2010-12-30
  • 打赏
  • 举报
回复
关键是你版本的各部分数据可能为多大,需占几位存储,然后才能生产该 Byte ,否则可能无法存放你的版本数据啊!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧