是否有一种聪明的(即:无分支)方式来"压缩"十六进制数.基本上将所有的0都移到一边?
例如:
0x10302040 -> 0x13240000
Run Code Online (Sandbox Code Playgroud)
要么
0x10302040 -> 0x00001324
Run Code Online (Sandbox Code Playgroud)
我看了Bit Twiddling Hacks,但没有看到任何东西.
这是一个SSE数值旋转算法.我需要删除任何变为0的枢轴.我可以用它_mm_cmpgt_ps
来找到好的枢轴,_mm_movemask_ps
将其转换为面具,然后咬一下以获得类似上面的东西.十六进制值进入掩码,以获得在_mm_shuffle_ps
SSE 128位寄存器上执行置换的指令.
List<int?> listONullables = new List<int?>();
IList degenericed = listONullables;
// This works fine
listONullables.Add(null);
// Run time exception:
// "The value "" is not of type "System.Nullable`1[System.Int32]"
// and cannot be used in this generic collection. Parameter name: value"
degenericed.Add(null);
// Also does not work. Same exception
degenericed.Add((int?)null);
// Also does not work
// EDIT: I was mistaken, this does work
degenericed.Add((int?)1);
// Also does not work
// EDIT: I was mistaken, this does work
degenericed.Add(1);
Run Code Online (Sandbox Code Playgroud)
请参阅上面代码中的注释. …
我正在用C#进行流体模拟.每个循环我需要计算空间中离散点处流体的速度.作为计算的一部分,我需要几十千字节的空间来容纳一些double []数组(数组的确切大小取决于一些输入数据).数组仅在使用它们的方法的持续时间内需要,并且有一些不同的方法需要这样的临时空间.
在我看来,有一些不同的解决方案来构建临时数组:
每次调用方法时,使用'new'从堆中获取内存.这就是我最初做的事情,但是它给垃圾收集器带来了很大的压力,而每秒一到两次的几毫秒尖峰真的很烦人.
在调用方法时将临时数组作为参数传递.问题是,这迫使用户管理它们,包括适当地调整它们,这是一个巨大的痛苦.并且它使得使用或多或少的临时存储器变得困难,因为它改变了API.
在不安全的上下文中使用stackalloc从程序堆栈中分配临时内存.这可以正常工作,除了我需要使用/ unsafe进行编译并在我的代码中不断地散布不安全的块,我想避免.
程序启动时预先分配私有数组.这很好,除非我不一定知道我需要的数组的大小,直到我可以查看一些输入数据.它变得非常混乱,因为你不能将这些私有变量的范围限制为单一方法,因此它们不断地污染命名空间.并且随着需要暂存内存的方法数量的增加,它的扩展性很差,因为我分配的内存很多,只占用了一小部分时间.
创建某种中央池,并从池中分配临时内存阵列.这个问题的主要问题是我没有看到从中央池分配动态大小的数组的简单方法.我可以使用起始偏移和长度,并且所有临时内存基本上共享一个大型数组,但我有很多现有的代码假定double [] s.而且我必须小心使这样的池线程安全.
...
有没有人有类似问题的经验?从经验中提供的任何建议/课程?
我有一个非托管库,它有这样的功能:
type* foo();
Run Code Online (Sandbox Code Playgroud)
foo
基本上通过分配托管type
堆上的非托管实例Marshal.AllocHGlobal
.
我有一个托管版本type
.它不是blittable但我MarshalAs
在成员上设置属性,所以我可以使用它Marshal.PtrToStructure
来获得它的托管版本.但不得不foo
用额外的簿记打电话来打电话Marshal.PtrToStructure
有点烦人.
我希望能够在C#方面做这样的事情:
[DllImport("mylib", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.LPStruct)]
type* foo();
Run Code Online (Sandbox Code Playgroud)
让C#的marshaller处理幕后转换,就像它对函数参数一样.我以为我应该能够这样做因为type
在托管堆上分配了.但也许我不能?有没有办法让C#的内置编组器为我处理返回类型的非托管到托管转换而无需手动调用Marshal.PtrToStructure
?
我正在用C#编写一些数学代码,强制它在发布时为x86编译,优化,我正在看windbg中的反汇编.它通常都很好,经常写出比我更好的装配(不是说我在组装方面都很擅长,但你去了).
但是,我注意到这个功能:
static void TemporaryWork()
{
double x = 4;
double y = 3;
double z = Math.Atan2(x, y);
}
Run Code Online (Sandbox Code Playgroud)
正在制作这个反汇编:
001f0078 55 push ebp
001f0079 8bec mov ebp,esp
001f007b dd05a0001f00 fld qword ptr ds:[1F00A0h]
001f0081 83ec08 sub esp,8
001f0084 dd1c24 fstp qword ptr [esp]
001f0087 dd05a8001f00 fld qword ptr ds:[1F00A8h]
001f008d 83ec08 sub esp,8
001f0090 dd1c24 fstp qword ptr [esp]
001f0093 e86e9ba66f call clr!GetHashFromBlob+0x94e09 (6fc59c06) (System.Math.Atan2(Double, Double), mdToken: 06000de7)
001f0098 ddd8 fstp st(0)
001f009a 5d pop ebp
001f009b c3 …
Run Code Online (Sandbox Code Playgroud) 在不安全的上下文中,我有一些看起来像这样的代码:
ValidatePartialOperation(array, startingOffset, runLength);
fixed (double* _op = array)
{
double* op = _op + startingOffset;
callSomething(op, runLength);
}
Run Code Online (Sandbox Code Playgroud)
我将这个副本粘贴在几个不同的地方.但是我讨厌在多个地方进行那种验证和指针算法,所以我想把逻辑组合成一行看起来像这样的:
double* op = preCall(array, startingOffset, runLength);
callSomething(op, runLength);
postCall(array);
Run Code Online (Sandbox Code Playgroud)
甚至更好:
using (double* op = preCall(array, startingOffset, runLength))
{
callSomething(op, runLength);
}
Run Code Online (Sandbox Code Playgroud)
但无论发生什么,我都不能失去"固定"版本的性能.
我现在的计划是模仿固定语句正在做什么,但我实际上并不知道那是什么.可能是一些具有钉扎操作的try-catch块?
所以我在这个简化的例子中有两个表:人和房子.人们可以拥有多个房子,所以我有一个People.Houses字段,这是一个带逗号分隔符的字符串(例如:"House1,House2,House4").房子里面可以有多个人,所以我有一个Houses.People字段,它的工作方式相同("Sam,Samantha,Daren").
我想找到People表中与给定房屋中人员姓名相对应的所有行,反之亦然,因为房屋属于人.但我无法弄清楚如何做到这一点.
这是我到目前为止所接近的:
SELECT People.*
FROM Houses
LEFT JOIN People ON Houses.People Like CONCAT(CONCAT('%', People.Name), '%')
WHERE House.Name = 'SomeArbitraryHouseImInterestedIn'
Run Code Online (Sandbox Code Playgroud)
但是我得到了一些误报(例如:当我想要Samantha时,Sam和Samantha可能都会被抓住.而当我想要House343时,同样有House3,House34和House343).
我想我可能会尝试编写一个SplitString函数,这样我就可以将一个字符串(使用一个分隔符列表)拆分成一个集合,并在该集合上做一些子查询,但是MySQL函数不能将表作为返回值.
同样,您不能将数组存储为字段,并且从我收集的内容中,长字符串中的逗号分隔元素似乎是解决此问题的常用方法.
我可以想出一些不同的方法来获得我想要的东西,但我想知道是否有一个不错的解决方案.
我有一个(2D)计算几何库我正在研究,我希望能够吐出图片来帮助调试.我想要的基元是点,线段和文本.但我手边还不知道我会感兴趣的是什么尺度(可能只有多边形的一小部分不能正常工作),所以我需要能够缩放和平移图像.
当我在Chrome中查看时,我连接SVGPan来平移和放大我生成的图像,但是(可以理解)所有基元都使用缩放进行缩放,因为SVGPan只使用缩放变换.因此放大并没有帮助弄清楚在非常小的特征区域中发生了什么.
我找到了矢量效果属性,通过让我指定宽度(以像素为单位)来很好地修复线段.但它无助于我管理文本.理想情况下,无论变换规模有多大,它都是12 pt.
而且我仍然对绘制积分感到茫然.我以为我可以使用圆圈,但半径也会缩放,所以如果放大太远,它看起来就像一堆圆圈而不是点.如果我使用矢量效果属性,圆的笔触宽度将不再缩放,但圆的半径仍然存在.所以我最终得到的是带有细轮廓的大圆圈,而不是一个半圆形像素的小圆圈.
有没有办法只扩展元素的位置,也许?我总是希望线条,点和文字看起来都是相同的大小,无论比例如何,只有它们的位置可以缩放.我的SVG文件都是机器生成的,严格来帮我编码,所以我不介意奇怪的黑客,如果有人有任何想法.或者,如果有另一种技术而不是SVG对这个用例更有意义.
我有一个枚举枚举从外部API返回的整数值,以便在我的代码中使用.但是我不一定知道编译时的整数值,所以我有一些代码在程序启动时挂起它们并将它们存储在Dictionary中.
我已经定义了一些转换为/从整数代码转换的扩展方法,但这些整数代码与从转换为int返回的代码不同.如果另一个程序员用我的枚举进行编程,我担心他们会尝试从习惯中抛出整数.程序只会默默地接受错误的代码.
有没有办法阻止我的枚举显式转换为/从int?如果没有,有没有办法导致异常被抛出,如果有人尝试?或者连接我自己的转换函数?或者在运行时更改枚举的基础值?