Tag: 位操作

在ushort中设置比特范围

假设我有一个ushort值,我想设置位1到4(假设0是LSB,15是MSB)。 在C ++中,您可以定义一个映射出特定位的结构: struct KibblesNBits { unsigned short int TheStart: 1; unsigned short int TheMeat: 4; unsigned short int TheRest: 11; } 然后你可以直接为’TheMeat’赋值。 我想在C#中做类似的事情。 理想情况下,我想要一个看起来像这样的function定义: public ModValue SetRange(ModValue valueToMod, int startIndex, int endIndex, RangeValue rangeValueToAssign) 还需要确定rangeValueToAssign不超过最大大小(假设值从0到最大值无符号)。 因此,如果范围是1到4,则为4位,范围将为0到15.如果超出这些限制,则抛出exception。 我没有在BitConverter类中找到任何可以执行此类操作的内容。 我能想到的最好的就是使用manaul移位运算符。 有一个更好的方法吗? 编辑:非通用版本可能如下所示: public static ushort SetRange(ushort valueToMod, int startIndex, int endIndex, ushort rangeValueToAssign) { // Determine […]

是否有一个函数在C#中为字节数组做圆形位移?

我似乎无法找到是否有内置的方法来执行字节数组的循环位移,C的ROL和ROR用于单个字节? 让我解释一下,比方说,我有一个数组(二进制): [0] = 11001110 [1] = 01000100 [2] = 10100001 然后如果我想做ROL_Array(1 bit)或向左移动1位,我会得到: [0] = 10011100 [1] = 10001001 [2] = 01000011 或者,如果我想做ROR_Array(2 bits)或向右移动2位,我会得到: [0] = 00110011 [1] = 01010001 [2] = 10101000

将java方法转换为C#:使用位移运算符将字节转换为整数

我试图将以下两种方法转换为c#而没有.net编译器向我抱怨。 坦率地说,我只是不明白这两种方法是如何真正在幕后工作的。 所以答案和解释在这里会很棒。 public static int bytesToInt(byte b0, byte b1, byte b2, byte b3) { return (((int)b0 << 24) & 0xFF000000) | (((int)b1 << 16) & 0x00FF0000) | (((int)b2 <>> 8) & 0x00FF); result[1] = (byte) ((c >>> 0) & 0x00FF); return result; } 第二种方法特别令人困惑,因为使用的移位算子与第一种方法不同。 在此先感谢您的帮助。

是否可以创建一个通用的按位枚举’IsOptionSet()’方法?

下面的代码可以很容易地传入一个HtmlParserOptions集合,然后检查一个选项以查看它是否被选中。 [Flags] public enum HtmlParserOptions { NotifyOpeningTags = 1, NotifyClosingTags = 2, NotifyText = 4, NotifyEmptyText = 8 } private bool IsOptionSet(HtmlParserOptions options, HtmlParserOptions singleOption) { return (options & singleOption) == singleOption; } 我的问题是,是否可以创建一个通用版本(我猜通过在方法属性上实现一个接口),它将与任何带有Flags属性的枚举一起使用?

表示2的补码中的hex值

我有一个字符串hex值,我需要用2的补码来表达它。 string hx = “FF00”; 我做的是,将其转换为二进制: string h = Convert.ToString(Convert.ToInt32(hx, 16), 2 ); 然后反转它,但我不能使用NOT运算符。 是否有任何简短的方法来反转位然后加1(2的补码运算)?

C# – 快速比较2个整数,逐位比较,输出多于一个整数,可能吗?

我有两个输入整数和一个输出列表 myoutputlist。 我的意见可以说 A = 0x 110101 B = 0x 101100 然后我根据A和B数计算了一个C整数。我已经编码了它的算法,我可以计算C整数。 C整数表示应该更改哪些位。 1值表示改变位,0值表示不变位。 每次只能更改一位。 由于C整数取决于A和B输入,有时需要改变1位,有时3位,有时8位。 在给定的A和B值中,我有如下的C整数 C = 0x 0 1 00 1 0(1代表改变值;在这种情况下应改变第二和第五位) 因为C整数的值为“1”两次; 在这种情况下应该有2个结果 结果1 – 仅更改第二位,其他位与A(0x110101)相同: 改变A => D1 = 1101 1 1的第二位 结果2 – 仅改变第五位,其他位与A(0x110101)相同: 改变A => D2 = 1 1 0101的第五位 我在想的是使用for循环,逐步移动A和C,并使用&1掩码到C? 并检查它是否等于“1” for(i=0;i>i)&1; //I tried to check if […]

可以将按位数学用于SQL中的一对多关系吗?

RDBMS中的正确规范化意味着表的扩散。 整数字段可以将正交数据存储为位 – 这可以用作替代附加表,而不会牺牲关系完整性吗?

ushort上的C#按位移位(UInt16)

我需要对16位整数(ushort / UInt16)执行按位左移,但C#中的按位运算符似乎只适用于int(32位)。 我如何使用<< on ushort,或者至少通过简单的解决方法获得相同的结果?

我如何从int得到一个位?

我明白那个: int bit =(number >> 3)&1; 将给我从左边的位3位,所以假设8是1000所以这将是0001。 我不明白的是,“&1”将删除除最后一位之外的所有内容,以显示简单为“1”的输出。 我知道这有效,我知道如何从一个int获得一点但是代码是如何提取单个位的呢? 码… int number = 8; int bit = (number >> 3) & 1; Console.WriteLine(bit);

可包含整数值的最小字节数

给定一个整数值,我需要一些方法来找出存储该值所需的最小字节数。 该值可以是有符号或无符号的,最多为64位 。 还要将符号位考虑为有符号整数。 例如: 8 requires 1 byte at minimum unsigned 255 requires 1 byte at minimum signed 255 requires 2 bytes at minimum 4351 requires 2 bytes at minimum -4294967296 requires 5 bytes at minimum unsigned 0xFFFFFFFFFFFFFFFF requires 8 bytes at minimum 我可以想到一种快速而肮脏的方法来解决这个问题,使用许多if语句,但可能有更好的方法(例如更简单,更聪明,更快)。 您可以假设一个带签名int (long value, bool signed)的方法int (long value, bool signed)或两个方法int (long […]