相关疑难解决方法(0)

优雅地确定多个布尔值是否为"true"

我有一组五个布尔值.如果其中不止一个是真的,我想要执行特定的功能.您能想到的最优雅的方法是什么,这样我才能在单个if()语句中检查这种情况?目标语言是C#,但我也对其他语言的解决方案感兴趣(只要我们不讨论特定的内置函数).

一个有趣的选择是将布尔值存储在一个字节中,进行右移并与原始字节进行比较.类似if(myByte && (myByte >> 1))但是这需要将单独的布尔值转换为一个字节(通过bitArray?),这似乎有点(双关语)笨拙... [编辑]对不起,应该是 if(myByte & (myByte - 1)) [/ edit]

注意:这当然非常接近经典的"人口数量","横向增加"或"汉明重量"编程问题 - 但不完全相同.我不需要知道有多少位被设置,只要它不止一个.我希望有一种更简单的方法来实现这一目标.

c# hammingweight

73
推荐指数
8
解决办法
3万
查看次数

C#中的x86/x64 CPUID

我的其他问题相关,请帮我调试"未知模块中发生未处理的类型'System.AccessViolationException'异常.附加信息:尝试读取或写入受保护的内存.这通常表明其他内存已损坏." 逐步执行代码,一切都会一直运行,直到实际调用del()并在该行中失败.

这段代码基于本文的示例python代码,它在python中运行.我无法得到代码示例,因为它可以工作(相同的例外),但我希望它只是有点过时或者其他东西.

编辑:如果你关心我们如何到达这里,看看编辑历史,这是无趣的.

完成工作版:

public static class CpuID
{
    public static byte[] Invoke(int level)
    {
        IntPtr codePointer = IntPtr.Zero;
        try
        {
            // compile
            byte[] codeBytes;
            if (IntPtr.Size == 4)
            {
                codeBytes = x86CodeBytes;
            }
            else
            {
                codeBytes = x64CodeBytes;
            }

            codePointer = VirtualAlloc(
                IntPtr.Zero,
                new UIntPtr((uint)codeBytes.Length),
                AllocationType.COMMIT | AllocationType.RESERVE,
                MemoryProtection.EXECUTE_READWRITE
            );

            Marshal.Copy(codeBytes, 0, codePointer, codeBytes.Length);

            CpuIDDelegate cpuIdDelg = (CpuIDDelegate)Marshal.GetDelegateForFunctionPointer(codePointer, typeof(CpuIDDelegate));

            // invoke
            GCHandle handle = default(GCHandle);
            var buffer = new byte[16];

            try
            { …
Run Code Online (Sandbox Code Playgroud)

c# inline-assembly cpuid

31
推荐指数
3
解决办法
2万
查看次数

如何从C#调用CPU指令?

我的处理器(Intel i7)支持POPCNT instruction,我想从我的C#应用​​程序中调用它.这可能吗?

我相信我在某个地方读到它不是,但如果它发现它可用,JIT会调用它但是我必须调用哪个函数可以用这样的指令代替?

Popcount在一个循环中被调用了数百万次,所以我希望能够在可能的情况下进行CPU优化.

c# cpu optimization hammingweight

10
推荐指数
1
解决办法
572
查看次数

标签 统计

c# ×3

hammingweight ×2

cpu ×1

cpuid ×1

inline-assembly ×1

optimization ×1