最近幹活時,因爲需要往服務器多傳個參數,但是又因爲網絡協議不好改,所以就有了這麼個需求,要往一個32位bit的int裏塞上2個參數,所以就涉及到高位字節,低位字節的問題了。
一寫才發現,平時寫業務多了,一到這種基礎的東西時,上學時學的這些基礎知識就都還給老師了。連查帶測試的搞了半天,寫了個工具類。這裏丟上來,方便也遇到這種需求的同學取用,不用跟我一樣費勁的再整一遍了。
這裏就不囉嗦的講概念,原理了,你應該也能從別處找到更詳細的。
/// <summary>
/// bit位操作助手
/// </summary>
public class BitHelper
{
/// <summary>
/// 8 * 0.5f
/// </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 GetLeftBit(byte data)
{
return (byte) (data >> C_BYTE_HALF_BIT & C_BYTE_HALF_BIT_MAX_VALUE);
}
/// <summary>
/// 獲取右側低位
/// </summary>
public static byte GetRightBit(byte data)
{
return (byte) (data & C_BYTE_HALF_BIT_MAX_VALUE);
}
/// <summary>
/// 交換左右高低位
/// </summary>
public static byte SwapLeftRight(byte data)
{
return (byte) ((data << C_BYTE_HALF_BIT) | (data >> C_BYTE_HALF_BIT & C_BYTE_HALF_BIT_MAX_VALUE));
}
/// <summary>
/// 左側高位賦值
/// </summary>
public static byte SetLeft(byte sourceData, byte leftData)
{
// 左側高4位清零
byte zero = (byte) (sourceData & C_BYTE_HALF_BIT_MAX_VALUE);
// 因爲我們是往高位賦值,所以要先把輸入的值移動到高位上去
byte ret = (byte) (zero | leftData << C_BYTE_HALF_BIT);
return ret;
}
/// <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;
public static int GetLeftBit(int data)
{
return (int) (data >> C_INT32_HALF_BIT & C_INT32_HALF_BIT_MAX_VALUE);
}
public static int GetRightBit(int data)
{
return (int) (data & C_INT32_HALF_BIT_MAX_VALUE);
}
public static int SwapLeftRight(int data)
{
return (int) ((data << C_INT32_HALF_BIT) | (data >> C_INT32_HALF_BIT & C_INT32_HALF_BIT_MAX_VALUE));
}
public static int SetLeft(int sourceData, int leftData)
{
int zero = (int) (sourceData & C_INT32_HALF_BIT_MAX_VALUE);
int ret = (int) (zero | leftData << C_INT32_HALF_BIT);
return ret;
}
}
在使用時要注意高低位的表示範圍,我們知道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類型。