一个高低位字节的助手类

最近干活时,因为需要往服务器多传个参数,但是又因为网络协议不好改,所以就有了这么个需求,要往一个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类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值