最近干活时,因为需要往服务器多传个参数,但是又因为网络协议不好改,所以就有了这么个需求,要往一个32位bit的int里塞上2个参数,所以就涉及到高位字节,低位字节的问题了。
一写才发现,平时写业务多了,一到这种基础的东西时,上学时学的这些基础知识就都还给老师了。连查带测试的搞了半天,写了个工具类。这里丢上来,方便也遇到这种需求的同学取用,不用跟我一样费劲的再整一遍了。
这里就不啰嗦的讲概念,原理了,你应该也能从别处找到更详细的。
/*
* AuthorNote:
* Created By: WangYu Date: 2021-12-27
*/
namespace Tools
{
/// <summary>
/// 数据高低位扩展
/// </summary>
public static class HighLowBitExt
{
#region byte 类型 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// <summary>
/// 8 * 0.5
/// </summary>
public const byte C_BYTE_HALF_BIT = 4;
/// <summary>
/// 0x0f = 2^4-1 = 15
/// </summary>
public const byte C_BYTE_HALF_BIT_MAX_VALUE = 0x0f;
/// <summary>
/// 获取左侧高位
/// </summary>
public static byte GetHighBit(this byte rawData)
{
return (byte) (rawData >> C_BYTE_HALF_BIT & C_BYTE_HALF_BIT_MAX_VALUE);
}
/// <summary>
/// 获取右侧低位
/// </summary>
public static byte GetLowBit(this byte rawData)
{
return (byte) (rawData & C_BYTE_HALF_BIT_MAX_VALUE);
}
/// <summary>
/// 交换高低位
/// </summary>
public static byte SwapHighAndLow(this byte rawData)
{
return (byte) ((rawData << C_BYTE_HALF_BIT) | (rawData >> C_BYTE_HALF_BIT & C_BYTE_HALF_BIT_MAX_VALUE));
}
/// <summary>
/// 设置左侧高位
/// </summary>
public static byte SetHigh(this byte rawData, byte highData)
{
// 左侧高4位清零
byte zero = (byte) (rawData & C_BYTE_HALF_BIT_MAX_VALUE);
// 因为我们是往高位赋值,所以要先把输入的值移动到高位上去
byte ret = (byte) (zero | highData << C_BYTE_HALF_BIT);
return ret;
}
/// <summary>
/// 设置右侧低位
/// </summary>
public static byte SetLow(this byte rawData, byte lowData)
{
byte highData = rawData.GetHighBit();
byte result = lowData.SetHigh(highData);
return result;
}
#endregion byte 类型
#region int 类型 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// <summary>
/// 32 * 0.5f
/// </summary>
public const int C_INT32_HALF_BIT = 16;
/// <summary>
/// 0xffff = 2^16-1 = 65535
/// </summary>
public const int C_INT32_HALF_BIT_MAX_VALUE = 0xffff;
/// <summary>
/// 获取左侧高位
/// </summary>
public static int GetHighBit(this int rawData)
{
return rawData >> C_INT32_HALF_BIT & C_INT32_HALF_BIT_MAX_VALUE;
}
/// <summary>
/// 获取右侧低位
/// </summary>
public static int GetLowBit(this int rawData)
{
return rawData & C_INT32_HALF_BIT_MAX_VALUE;
}
/// <summary>
/// 交换高低位
/// </summary>
public static int SwapHighAndLow(this int rawData)
{
return (rawData << C_INT32_HALF_BIT) | (rawData >> C_INT32_HALF_BIT & C_INT32_HALF_BIT_MAX_VALUE);
}
/// <summary>
/// 设置左侧高位
/// </summary>
public static int SetHigh(this int rawData, int highData)
{
int zero = rawData & C_INT32_HALF_BIT_MAX_VALUE;
int ret = zero | highData << C_INT32_HALF_BIT;
return ret;
}
/// <summary>
/// 设置右侧低位
/// </summary>
public static int SetLow(this int rawData, int lowData)
{
int highData = rawData.GetHighBit();
int result = lowData.SetHigh(highData);
return result;
}
#endregion int 类型
}
}
在使用时要注意高低位的表示范围,我们知道1bit就是1个2进制位,所以1bit能表示的值,它不是0就是1,也就是说它只能表示2个数。
同理,1byte的高,低位各是4个bit,所以它能表示的数呢?那就是 2^4=16 ,又因为2进制从0开始,所以=2^4-1=15,也就是说4bit能表示的最大数是15,这也是1byte最大255的原因。
所以这里需要注意到,分了高低位以后,你的这1byte,不能再表示最大256的数了,而是变成了能表示2个最大15的数。
上面的内容也同样适用于int类型。