C#好⽤的操作字节中某⼀位值的函数
C# 设置和获取⼀个字节的某⼀位的值的⽅法
⾃⼰⼯作中遇到需要对单字节的⾼位、低位进⾏赋值,即⼀个字节byte,想要给每⼀位都赋值,这
个值是动态来的,是0或是1。
好不容易收集到⼀些珍贵资料,整理⼀下:
⼀、设置
⽅法code:
/// <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);
}
调⽤code:
byte s = set_bit(8, 8, true);
结果:
s 的值为 136,结果正确。
⼆、获取值
获取⼀个字节中的每⼀位的值,需要分别与128 64 32 16 8 4 2 1相与&运算
假设字节为byte1
bit8 = byte1 & 128 == 128 ? 1 : 0;
bit7 = byte1 & 64 == 64 ? 1 : 0;
bit6 = byte1 & 32 == 32 ? 1 : 0;
bit5 = byte1 & 16 == 16 ? 1 : 0;
bit4 = byte1 & 8 == 8 ? 1 : 0;
bit3 = byte1 & 4 == 4 ? 1 : 0;
bit2 = byte1 & 2 == 2 ? 1 : 0;
bit1 = byte1 & 1 == 1 ? 1 : 0;
另外,收集到⽹络上的其他资料:
你好,感谢你阅读此帖.
今天我们要讨论的是在C#中如何获取⼀个数值中的某⼀位的数据,⽐如⼀个Byte型数据8,它的⼆进
制表⽰为00001000(⾼位到低位),那我应该怎样获取它的第3位的值1呢?
我的想法是这样的,先把第3位的值右移7-3=4位,然后再右移7位,最后取这个值,这样就把第3位前后
的值都变为0了,最后输出它的值为1.下⾯是我写的⼀个⽅法:
C# code
///<summary>
///获取数据中某⼀位的值
///</summary>
///<param name="input">传⼊的数据类型,可换成其它数据类型,⽐如Int</param>
///<param name="index">要获取的第⼏位的序号,从0开始</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;
}
恳请⼤家指正, 另外我想把它变成能处理不同数据类型的⽅法,⽐如运⽤范型,但是不知道怎么使⽤,请⼤家帮帮忙.
我看到C#中还有⼀些位操作的类,⽐如BitArray,BitVector32,好像都不合适,BitConvert好像也只是针对对字节流的转换
不知道⼤家有没有更好的⽅法,欢迎⼤家讨论.
writeline函数祝你⼯作顺利,天天开⼼.
回复:
想看那⼀位是1就把第⼏位设置为1,其他设置为0,同input进⾏与操作,返回,⼤于0则是1,==0则是0.
回复:
//index从0开始
//获取取第index位
public static int GetBit(byte b, int index) { return ((b & (1 << index)) > 0) ? 1: 0; }
//将第index位设为1
public static byte SetBit(byte b, int index) { return (byte)(b | (1 << index)); }
//将第index位设为0
public static byte ClearBit(byte b, int index) { return (byte)(b & (byte.MaxValue - (1 << index))); } //将第index位取反
public static byte ReverseBit(byte b, int index) { return (byte)(b ^ (byte)(1 << index)); }
回复:
private static int GetbitValue(byte input, int index)
{
int value;
value = index>0? input >> index-1: input;
return value &= 1;
}
回复:
C# code
//每8位为⼀个字节
private const int bitCout = 8;
///查询对象内存第index位值
static int GetValueOfIndex(object obj, int index)
{
int size = Marshal.SizeOf(obj);
System.IntPtr intPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj,intPtr,true);
Marshal.StructureToPtr(obj,intPtr,true);
byte[] byteArr = new byte[size];
Marshal.Copy(intPtr,byteArr,0,size);
int count;
index = Math.DivRem(index, 8, out count);
Marshal.FreeHGlobal(intPtr);
return (byteArr[size-index-1] >> (8-count-1)) & 1;
}
for (int i = 0; i < 32; i++)
{
int j = (int)Math.Pow(2, i);
Console.WriteLine(j + " : " + GetValueOfIndex(j, 31 - i)); }
Console.WriteLine(15.0f + " : " + GetValueOfIndex(13, 28));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论