动态比特移位/取消移位
我想以相同的方式将多个块值存储到整数中,因为我可以将IP转换为int.我的问题是我需要对n个块进行此操作,不仅是4.我还需要指定每个块的最大值,这对于所有块而言都是相同的. 因此,在下面的示例中,如果我想存储整个IP范围,我的模块是4,而我的块为255,这是每个块的最大值.但是,如果我降低了我的块和/或阻塞,这似乎是不起作用的. 这是我的第一次尝试,但它无法正常工作: const int BlockSize = 100; const int BlockCount = 3; int shiftedValues = Shift(BlockSize, BlockCount); for (int shiftedValue = 1; shiftedValue
8 2024-04-26
编程技术问答社区
需要帮助为一个特定的值格式写一个二进制阅读器扩展方法。6位然后7位的结构
好吧,这是 我目前需要为System.IO.BinaryReader类编写一个能够读取特定格式的扩展方法. 我不知道这种格式是什么,但我确实知道它是如何工作的,所以我将在下面描述它. 构成值的每个字节都被标记为指示读者接下来需要表现. 第一个字节具有2个标志,并且该值的任何后续字节都只有1个标志. First byte: 01000111 ^^^^^^^^ |||____|_ 6 bit value ||_______ flag: next byte required |________ flag: signed value Next bytes: 00000011 ^^^^^^^^ ||_____|_ 7 bit value |________ flag: next byte required 该值中的第一个字节具有2个标志,第一个位是值是正值或负数. 第二位是需要读取另一个字节. 剩下的6位是到目前为止的值,需要保存以后. 如果不需要读
10 2024-04-26
编程技术问答社区
如何确定一个2的幂值所需的右移位数?
我有一个接收两个值的函数. 我需要将其转换为枚举范围(0、1、2、3等),然后将其移回两个范围的功率. 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024 ... and so on. 如果我的功能接收到1024的值,我需要将其转换为10.在C#中执行此操作的最佳方法是什么?我应该只是在循环中不断划分2并计算迭代吗? 我知道我可以将其放回(1 解决方案 只需使用基本2的对数: Math.Log(/* your number */, 2) 例如,Math.Log(1024, 2)返回10. 更新: 这是一个相当强大的版本,该版本检查传递的数字是否有两个功能: public static int Log2(u
12 2024-04-26
编程技术问答社区
将一个范围转换为一个位数组
我正在编写C#中的关键代码,这要求我将两个未签名的整数转换为将包含范围定义为位字段的整数.例如: uint x1 = 3; uint x2 = 9; //defines the range [3-9] // 98 7654 3 //must be converted to: 0000 0011 1111 1000 它可能有助于以相反的顺序可视化钻头 此范围的最大值是在运行时给出的参数,我们将调用max_val.因此,应该将位字段变量定义为UInt32数组,大小等于max_val/32: UInt32 MAX_DIV_32 = max_val / 32; UInt32[] bitArray = new UInt32[MAX_DIV_32]; 给定变量定义的范围x1和x2,执行此转换的最快方法是什么? 解决方案 尝试一下.计算必须填充所有内容的数组项的范围,并通过在此范围内迭代来完成
8 2024-04-26
编程技术问答社区
位移--在C#.net与PHP中得到不同的结果
当我在PHP中运行此命令时,我会得到: Code: 2269495617392648 >> 24 Result: 32 当我在c#.net或vb.net中运行它时,我得到: Code: 2269495617392648 >> 24 Result: 135272480 PHP是正确的. 有趣的是,当我尝试移动大于.net中的任何数字时,它会产生不良结果. int32 (2147483647)下的每个数字都产生了php和c#.net或vb.net 的相同结果 .net中是否有解决方法? 解决方案 严格来说,PHP是错误的. 数字的整个位模式2269495617392648是: 1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648) 正确移动这24次让您: 0000 0000 0000 0000 0000 0000 1
16 2024-04-25
编程技术问答社区
如何将12位图像加载到System.Drawing.Bitmap?
我有一个服务12位图像的服务器,我可以通过HTTP访问图像,但是由于它是12位图像,所以我无法加载到System.Drawing.bitMap(Stream Stream). 图像格式png位深度12 图像在这里原始12位 这是一旦可以加载图像的外观. 解决方案 使用OPENCV库时,您可以读取图像,因为它也支持12bit. 您可能还喜欢寻找适配器/包装器,以便在C#中使用它,因为它最初是C ++库 还查看这些帖子: opencv:使用12bit Gray灰度原始数据 灰度图像的BMP格式是什么? 将12位Bayer Image转换为使用OpenCV 8位RGB 希望它有帮助
8 2024-04-25
编程技术问答社区
将BitArray转换为一个小的字节数组
我已经阅读了有关bitarray转换的其他帖子,并且我自己尝试了几个,但似乎没有一个我想要的结果. 我的情况就是这样,我有一些C#代码控制LED条.要向条带发出一个命令,我最多需要28位 1位用于在2个LED条之间选择 之间 6的位置(最大48个可寻址LED) 7颜色x3(颜色的0-127值) 假设我为该结构创建一个bitarray,作为一个例子,我们将其填充了半随机. BitArray ba = new BitArray(28); for(int i = 0 ;i
2 2024-04-25
编程技术问答社区
Bitwise enum cast的返回值不符合预期
我有以下枚举: [Flags] public enum PermissionLevel { User = 1, Administrator = 2, ITStaff = 3, Manager = 4, SuperAdministrator = 6, } 当我这样做时: PermissionLevel permission = (PermissionLevel) dr.GetInt32(i); 我获得了分配给"权限对象"的随机权限值.例如,如果 i 是6,我的权限对象返回"管理员|经理",我应该获得"超级管理员".当我将实例放回整数时,它会返回6. 我错过了什么吗? 解决方案 您需要确保每个值的组合都是唯一的: [Flags] public enum PermissionLevel { User = 1, Administrator = 2
2 2024-04-25
编程技术问答社区
在SQL和C#中使用64位有符号值模拟128位无符号整数?
采用以下方案:在SQL Server中,您有几个标志列出了(并实际上是由枚举)列出的.假设您是分销商,您允许您的经销商指定他们运送到的我们所说的.作为一名出色而优雅的软件工程师,您将它们作为可除以的标志值实现,以节省存储: 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 in
10 2024-04-24
编程技术问答社区
可以包含一个整数值的最小字节数
给定整数值,我需要一些方法来找出存储该值所需的最小字节数.该值可以是签名或未签名,最多可达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 我可以想到一种快速和差异的方法来解决此问
6 2024-04-24
编程技术问答社区
计算无符号长序列中的公共位
我正在寻找比以下算法更快的算法.给定64位未签名的整数的序列,返回序列中的64位中每个位的数量的数量. . 示例: 4608 = 0000000000000000000000000000000000000000000000000001001000000000 4097 = 0000000000000000000000000000000000000000000000000001000000000001 2048 = 0000000000000000000000000000000000000000000000000000100000000000 counts 0000000000000000000000000000000000000000000000000002101000000001 示例: 2560 = 0000000000000000000000000000000000000000000000000000101000000000 530 = 0000000
2 2024-04-23
编程技术问答社区
通过 SIMD 查找数组中元素的索引。快速方法
我需要通过SIMD在数组ARR中找到8位值元素n的索引/位置.它一定是一种快速的时尚. 目前,算法是我将ARR的8位值加载到一个SIMD寄存器中,而N的字符代码为其他SIMD寄存器. 然后我会使用否定并检查哪个字节成功使用Popcnt. 有一个更快方式吗? 如果需要,可以使用操作饱和. 解决方案 您正在使用哪个指令集/体系结构?这将在某种程度上影响此问题的"正确"答案. 在SSE中: #include #include int byteIndex(__m128i ARR, __m128i N) { __m128i cmp = _mm_cmpeq_epi8(ARR, N); int mask = _mm_movemask_epi8(cmp); return _tzcnt_u32(mask); } int main() { __m128i ARR = _mm_setr_epi8(0
2 2024-04-22
编程技术问答社区
尝试编写 Gerd Isenberg'Bit Scan Forward 的矢量化实现作为练习
我正在尝试将BSF的矢量化实现作为练习,但我卡住了,它行不通. 算法: short bitScanForward(int16_t bb) { constexpr uint16_t two = static_cast(2); constexpr uint16_t zero = static_cast(0); uint16_t lsb; bb &= -bb; lsb = (unsigned short)bb | (unsigned short)(bb >> short(8)); return static_cast(((((((unsigned short)(bb >> short(8)) != zero) * two) + ((lsb & unsigned short(0xf0f0)) != zero)) *
2 2024-04-22
编程技术问答社区
如何在 SSE/AVX 中执行 bitwise NOT?
是我的想象力,还是SSE和AVX缺少的PNOT指令?也就是说,向矢量中的每一点都翻转的指令. 如果是的,是否有比PXOR有更好的方式对其进行模拟的方法?非常烦人,因为我需要设置所有1秒的向量才能使用该方法. 解决方案 对于这样的案例,查看编译器会产生什么是有启发性的. 例如.对于以下功能: #include __m256i test(const __m256i v) { return ~v; } GCC和Clang似乎都在生成几乎相同的代码: test(long long __vector(4)): vpcmpeqd ymm1, ymm1, ymm1 vpxor ymm0, ymm0, ymm1 ret 其他解决方案 如果使用内在的,则可以使用这样的内联函数将其分开操作. inline __m256i _mm256_not_si256 (_
8 2024-04-22
编程技术问答社区
C#中的双位数NOT(~~)。
我一直在阅读ThreadLocal实现,在将int ID倒置之前,在将其存储在私人int备份之前(m_idComplement),然后在几乎每个表达式中再次反转它,然后再将其倒回去使用.除在第240行上,它确实分配了0而无需否定,但是它本来可以分配A -1并丢弃所有其他不必要的,不是吗? https://i.stack.imgur.com/drjc5.png 解决方案 参考source for ThreadLocal.cs对此领域的以下评论: 此ThreadLocal 实例的插槽ID.我们存储了ID的位互补(即〜ID),这使我们能够在ID为0和不完全初始化的对象(由于构造函数中的线程中止或可能是由于存储器模型引起的,都可以区分情况下的情况在用户代码中发行. 他们本质上是从0切换ID的默认值,非初始化的值,如果直接存储为int字段,则将其切换为-1. .
0 2024-04-22
编程技术问答社区
在C#中从一个恒定的位宽扩展符号
我有一个值,长度为5位. 4位确定数字,第5位确定符号,通过保持-16和+15之间的任何值.如何完成从C#中恒定的位宽度延伸的符号?我知道在C中,我可以使用以下内容来完成此操作: int x; // convert this from using 5 bits to a full int int r; // resulting sign extended number goes here struct {signed int x:5;} s; r = s.x = x; 我该如何在C#? 中做类似的事情 解决方案 并不清楚您的意思是什么,但是可以像: 一样简单 int fiveBits = normal & 0x1f; 和反向: int normal = fiveBits
6 2024-04-22
编程技术问答社区
C#在字节数组中存储int
我从事一个小项目,我需要将4 int类型存储在字节数组中(稍后将在插座上发送). 这是代码: int a = 566; int b = 1106; int c = 649; int d = 299; byte[] bytes = new byte[16]; bytes[0] = (byte)(a >> 24); bytes[1] = (byte)(a >> 16); bytes[2] = (byte)(a >> 8); bytes[3] = (byte)a; 我移动了第一个值的位,但是我现在不确定如何回收它...进行反向过程. 我希望我的问题很清楚,如果我错过了东西,我会很高兴再次解释它. 谢谢. 解决方案 要从字节数组中提取Int32退回,请使用此表达式: int b = bytes[0]
6 2024-04-21
编程技术问答社区
我是如何从一个int中获得一个位的呢?
我明白: int bit =(数字>> 3)&1; 会给我左边的位3个位置,所以说8是1000,那就是0001. 我不明白的是"&1"将如何删除所有内容以显示简单" 1"的输出.我知道这有效,我知道如何从int中获取一点,但是它是如何提取单个位的? 的? 代码... int number = 8; int bit = (number >> 3) & 1; Console.WriteLine(bit); 解决方案 除非我的布尔式代数从学校失败,否则发生的事情应该等同于以下内容: * 1100110101101 // last bit is 1 & 0000000000001 // & 1 = 0000000000001 // = 1 * 1100110101100 // last bit is 0 & 0000000000001 // & 1 = 000000000000
4 2024-04-21
编程技术问答社区