获取一个数值中某一位的数据

zhxingway 2010-01-21 11:20:39
你好,感谢你阅读此帖.

今天我们要讨论的是在C#中如何获取一个数值中的某一位的数据,比如一个Byte型数据8,它的二进制表示为00001000(高位到低位),那我应该怎样获取它的第3位的值1呢?

我的想法是这样的,先把第3位的值右移7-3=4位,然后再右移7位,最后取这个值,这样就把第3位前后的值都变为0了,最后输出它的值为1.下面是我写的一个方法:

/// <summary>
/// 获取数据中某一位的值
/// </summary>
/// <param name="input">传入的数据类型,可换成其它数据类型,比如Int</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好像也只是针对对字节流的转换

不知道大家有没有更好的方法,欢迎大家讨论.

祝你工作顺利,天天开心.
...全文
2109 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxingway 2010-01-22
  • 打赏
  • 举报
回复
zhxingway 2010-01-21
  • 打赏
  • 举报
回复


自己顶一下,抛砖引玉,提高知名度.
lanfengsese 2010-01-21
  • 打赏
  • 举报
回复
up
烈火蜓蜻 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiayp004 的回复:]
想看那一位是1就把第几位设置为1,其他设置为0,同input进行与操作,返回,大于0则是1,==0则是0.
[/Quote]

没错,就是这么简单

比如

/// <summary>
/// 获取数据中某一位的值
/// </summary>
/// <param name="input">传入的数据类型,可换成其它数据类型,比如Int</param>
/// <param name="index">要获取的第几位的序号,从0开始</param>
/// <returns>返回值为-1表示获取值失败</returns>
private int GetbitValue( int input, int index )
{
return ( input & ( ( uint )1 << index ) ) > 0 ? 1 : 0;
}
zhxingway 2010-01-21
  • 打赏
  • 举报
回复
谢谢ouc_ajax,厉害厉害
ouc_ajax 2010-01-21
  • 打赏
  • 举报
回复


//每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);
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));



ps:恶搞版(支持所有托管类型结构)
林三一 2010-01-21
  • 打赏
  • 举报
回复
leafold 2010-01-21
  • 打赏
  • 举报
回复
另外为什么用sizeof(Byte),它永远等于1的。
leafold 2010-01-21
  • 打赏
  • 举报
回复
private static int GetbitValue(byte input, int index)
{
int value;
value = index>0? input >> index-1: input;
return value &= 1;
}
leafold 2010-01-21
  • 打赏
  • 举报
回复
如果是整数,右移n-1位后and 1
zhxingway 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jiayp004 的回复:]
想看那一位是1就把第几位设置为1,其他设置为0,同input进行与操作,返回,大于0则是1,==0则是0.
[/Quote]

不错不错,这也是一种方法,呵呵 .
qushazimingzia 2010-01-21
  • 打赏
  • 举报
回复
up
qlzf11140820 2010-01-21
  • 打赏
  • 举报
回复
&
xujiaoxiang 2010-01-21
  • 打赏
  • 举报
回复 1
//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)); }
xiatao1982 2010-01-21
  • 打赏
  • 举报
回复
up
Justin-Liu 2010-01-21
  • 打赏
  • 举报
回复
mark
jiayp004 2010-01-21
  • 打赏
  • 举报
回复
想看那一位是1就把第几位设置为1,其他设置为0,同input进行与操作,返回,大于0则是1,==0则是0.

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧