我知道它已被证明是NP完全的,那没关系.我正在用分支和边界解决它,我将初始上限设置为正常二进制平方/乘法算法的乘法次数,并且它确实给出了正确的答案,但我对运行不满意时间(200左右的数字可能需要几秒钟).这是一个NP完全问题,我不期待任何壮观的事情; 但通常有一些技巧可以让实际时间得到控制.
在实践中有更快的方法吗?如果是这样,他们是什么?
变量移位是否会产生部分寄存器停顿(或寄存器重组μops)ecx?如果是这样,哪些微体系结构?
我在Core2(65nm)上进行了测试,这似乎是只读的cl.
_shiftbench:
push rbx
mov edx, -10000000
mov ecx, 5
_shiftloop:
mov bl, 5 ; replace by cl to see possible recombining
shl eax, cl
add edx, 1
jnz _shiftloop
pop rbx
ret
Run Code Online (Sandbox Code Playgroud)
更换mov bl, 5的mov cl, 5没有什么区别,这是否有寄存器重组正在进行,如可以通过更换证明它会shl eax, cl通过add eax, ecx(该版本在我的测试add写入时,经历了2.8倍放缓cl,而不是bl).
检测结果:
更新:shrxHaswell 的新班组确实表明失速.shift-count参数不是写成8位寄存器,因此可能是预期的,但文本表示实际上并没有说明这种微架构细节.
计算两个零抑制二元决策图的连接的算法是什么?
我现在已经搜索了几个小时,我找不到它.据我所知,它并不在Knuth的书中,尽管它确实给出了结果的定义.
我宁愿不必涉及任何具体的实施; 我发现实施细节非常分散注意力.
ZDDs的加入f和g是{ a ? b | a ? f and b ? g }
考虑以下程序:
for i=1 to 10000000 do
z <- z*z + c
Run Code Online (Sandbox Code Playgroud)
在哪里z和c是复杂的数字.
使用x87 vs SSE和单对双精度算法,该程序的高效x86汇编程序实现是什么?
编辑我知道我可以用另一种语言编写这个并信任编译器为我生成最佳的机器代码,但我这样做是为了学习如何自己编写最佳的x86汇编程序.我已经查看了生成的代码gcc -O2,我的猜测是有很大的改进空间,但我不够熟练自己编写最佳的x86汇编程序,所以我在这里寻求帮助.
对于这样的代码:
#include <stdint.h>
char* ptrAdd(char* ptr, uint32_t x)
{
return ptr + (uint32_t)__builtin_ctz(x);
}
Run Code Online (Sandbox Code Playgroud)
GCC 生成一个符号扩展:(godbolt 链接)
xor eax, eax
rep bsf eax, esi
cdqe ; sign-extend eax into rax
add rax, rdi
ret
Run Code Online (Sandbox Code Playgroud)
当然,这完全是多余的——这是公然对无符号整数进行符号扩展。我可以说服海湾合作委员会不要这样做吗?
这个问题自 GCC 4.9.0 以来就存在,但在此之前它曾经是一个显式的零扩展,这也是多余的。
错误信息:System.InvalidCastException:无法将类型为"ClassLibrary1.Plugin"的对象强制转换为"PluginInterface.IPlugin".
我正在尝试做的是让我的程序访问一个程序集并运行它可能具有的任何东西.这会加载.dll
private void AddPlugin(string FileName)
{
Assembly pluginAssembly = Assembly.LoadFrom(FileName);
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic)
{
if (!pluginType.IsAbstract)
{
Type typeInterface = pluginType.GetInterface("PluginInterface… true);
if (typeInterface != null)
{
Types.AvailablePlugin newPlugin = new Types.AvailablePlugin();
newPlugin.AssemblyPath = FileName;
newPlugin.Instance = (IPlugin)Activator.CreateInstance(plugin…
// Above line throws exception.
newPlugin.Instance.Initialize();
this.colAvailablePlugins.Add(newPlugin);
newPlugin = null;
}
typeInterface = null;
}
}
}
pluginAssembly = null;
}
Run Code Online (Sandbox Code Playgroud)
我的程序和程序集都有这两个接口:
using System;
namespace PluginInterface
{
public interface IPlugin
{
IPluginHost Host { get; set; …Run Code Online (Sandbox Code Playgroud) 
例如,对于8位数.我为什么要放弃这个?我明白溢出只是当我在同一个符号中添加2个数字并在另一个符号中得到结果时.这是什么情况?
所以我在这里很困惑,确实:是
a ^= b^c
Run Code Online (Sandbox Code Playgroud)
相当于
a = a ^ (b ^ c)
Run Code Online (Sandbox Code Playgroud)
或者是a = (a ^ b) ^ c吗?