一個高低位字節的助手類

最近幹活時,因爲需要往服務器多傳個參數,但是又因爲網絡協議不好改,所以就有了這麼個需求,要往一個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類型。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章