Tag: 位操作

使用64位有符号值在SQL和C#中模拟128位无符号整数?

采取这种情况:您在C#中绑定了一些标记枚举(实际上是从SQL Server中的Enum-ish表生成)。 假设您是经销商,并允许您的经销商指定他们发货的美国州。 作为一名出色而优雅的软件工程师,您将这些作为可按位组合的标志值实现以节省存储: create table USState ( StateID bigint, StateAbbr char(2), StateName varchar(50)) /* insert all US States + DC into USState, StateIDs must be in powers of two */ /* StateID 0 reserved for ‘None’: */ create procedure GetStatesByFlag (@StateFlags bigint) as declare @StateIDs table ( StateID bigint, primary key (StateID) ) insert […]

按位相等

我需要在两个字节之间执行按位相等。 这意味着,例如,如果我有两个字节:00011011和00011110,结果是11111010我看到的唯一快速方法是使用以下语句 byte a, b;//set input bytes byte c = ~(a^b);//output bytes 但我想知道是否有更快的解决方案。 在这些相等操作之后,我想掩盖我需要的位。 所以我需要使用AND操作。 所以代码变成: byte a, b;//set input bytes byte m;//mask, intresting bits are set to 1, others to 0 byte c = (~(a^b))&m;//output bytes 没有任何更快,更简单的方法,不需要使用所有这些按位操作,因为这部分代码将经常被调用。

在C#中存储长二进制(最多512位)的最佳方法

我试图找出在C#中存储大二进制(超过96位)数字的最佳方法 我正在构建应用程序,它将自动为轮class分配工作人员。 换档时间可短至15分钟(但未来可能会更小)。 为了避免工人的双重预订,我计划得到他们每日时间的二进制映射:24小时以相等的块(15分钟)分开,每个块都有一个标志(0表示免费,1表示忙)所以当我们试图给另一个转移到工人,我们可以对工人的每日可用性与轮class时间进行二元比较。 简单易行。 但是C#long只允许最多64位,并且在当前设置下我需要至少96位(每个周期24小时* 60分钟/ 15分钟)。 这种表示必须是内存友好的,因为一次操作大约有一百万个对象。 我考虑的其他选择很少: 串。 内存饥渴,实现逐位操作并不简单 位数组。 但据我所知,C#没有位类型 无符号整数数组。 每个数组仅代表一天的一部分。 我能想到的最好的 还有其他建议吗? 提前致谢!

为什么按位运算符不像逻辑“和\或”运算符那样智能

我只是注意到按位操作不像逻辑“和\或”操作那样“智能”,我想知道为什么? 这是一个例子: // For the record private bool getTrue(){return true;} private bool getFalse(){return false;} // Since a is true it wont enter getFalse. bool a = getTrue() || getFalse(); // Since a is false it wont enter getTrue. bool b = getFalse() && getTrue(); // Since b is false it wont enter getTrue. b = […]

在C#中使用任意位位置和长度提取字节边界的值

我目前正在研究一种网络工具,它需要对特定协议进行解码/编码,该协议将字段打包到任意位置的密集位数组中。 例如,协议的一部分使用3个字节来表示许多不同的字段: Bit Position(s) Length (In Bits) Type 0 1 bool 1-5 5 int 6-13 8 int 14-22 9 uint 23 1 bool 如您所见,有几个字段跨越多个字节。 许多(大多数)也比可能用于表示它们的内置类型短,例如第一个只有5位长的int字段。 在这些情况下,目标类型的最高有效位(例如Int32或Int16)应填充为0以弥补差异。 我的问题是我很难处理这类数据。 具体来说,我很难弄清楚如何有效地获取任意长度的位数组,用源缓冲区中的相应位填充它们,填充它们以匹配目标类型,并将填充的位数组转换为目标类型。 在理想的世界中,我将能够获取上面示例中的byte [3]并调用GetInt32(byte[] bytes, int startBit, int length) 。 我发现的最接近的东西是BitStream类,但它似乎希望单个值在字节/字边界上排列(并且类的半流/半索引访问约定使它变得有点混乱)。 我自己的第一次尝试是使用BitArray类,但事实certificate这有点笨拙。 很容易将缓冲区中的所有位填充到一个大的BitArray ,只将你想要的那些从源BitArray转移到一个新的临时BitArray ,然后将其转换为目标值…但它似乎是错误的,而且非常耗时的。 我现在正在考虑一个类如下的类,它引用(或创建)源/目标byte []缓冲区以及偏移量,并为某些目标类型提供get和set方法。 棘手的部分是获取/设置值可能跨越多个字节。 class BitField { private readonly byte[] _bytes; private readonly int _offset; […]

C#Bitwise-或运算符用于符号扩展操作数; 首先考虑转换为较小的无符号类型

我知道这些警告可能毫无意义..但无论如何我可以摆脱它们? 我收到了7个这样的警告。 Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first 这与OR运算符有关 我突出了发出警告的内容。 int result = (int)ror((uint)(v76 ^ (v75 | 0x862D63D3)), (uint)(BitConverter.ToInt32(v4, 72) ^ 0x22)); int v11 = (int)rol((uint)(int)((v8 & v10 | ~v10 & 0xEFCDAAC9) + v3[2] – 1126481991), 17); int v144 = (int)rol((uint)(int)((v141 & v143 | ~v143 & […]

在C#中反转1位

我有一个byte 1位(总是在最低位置),我想要反转。 即给定00000001我想获得00000000和00000000我想要00000001。 我这样解决了: bit > 0 ? 0 : 1; 我很想知道如何做到这一点。

C#语言:改变字节中的前四位

为了充分利用字节,我试图将两个唯一值存储到一个字节中:一个在前四位中,另一个在后四位中。 但是,我发现,虽然这种做法允许优化内存分配,但它使得更改存储在字节中的各个值变得困难。 在我的代码中,我想在一个字节中更改第一组四位,同时保持同一字节中后四位的值。 虽然按位运算允许我轻松检索和操作前四位值,但我发现很难将这个新值与一个字节中的第二组四位连接起来。 问题是,如何从一个字节中擦除前四位(或者更准确地说,将它们全部置零)并添加新的4位组以替换刚刚擦除的四位,从而保留最后4位改变前四个字节的位数? 这是一个例子: // Changes the first four bits in a byte to the parameter value public void changeFirstFourBits(byte newFirstFour) { // If ‘newFirstFour’ is 0101 in binary, make ‘value’ 01011111 in binary, changing // the first four bits but leaving the second four alone. } private byte value = 255; // […]

你如何在整数中随机归零?

更新了更新的答案和更好的测试 假设我的号码是382,即101111110。 我怎么能随机将一个不是0的位转到0? 为什么; 既然人们问我原因,我只需要这样做,从整数中删除一点。 基于这里的答案是结果(工作一) 我跑了这个 using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static Random random; static void Main(string[] args) { Stopwatch sw; int[] test = new int[10] { 382, 256, 1, 257, 999, 555, 412, 341, 682, 951 }; random = new Random(42); for […]

快速查找64位整数中设置最高和最低有效位的方法

StackOverflow上有很多关于此的问题。 很多 但是我找不到答案: 在C#中工作 适用于64位整数(而不是32位) 比…快: private static int Obvious(ulong v) { int r = 0; while ((v >>= 1) != 0) { r++; } return r; } 甚至 int r = (int)(Math.Log(v,2)); 我在这里假设一个64位Intel CPU。 一个有用的参考是Bit Hacks页面 ,另一个是fxtbook.pdf。然而,虽然这些提供了解决问题的有用方向,但它们没有给出准备好的答案。 我正在使用一个可重用的函数, 它只能为C#执行与_BitScanForward64和_BitScanReverse64类似的操作。