我有一组五个布尔值.如果其中不止一个是真的,我想要执行特定的功能.您能想到的最优雅的方法是什么,这样我才能在单个if()语句中检查这种情况?目标语言是C#,但我也对其他语言的解决方案感兴趣(只要我们不讨论特定的内置函数).
一个有趣的选择是将布尔值存储在一个字节中,进行右移并与原始字节进行比较.类似if(myByte && (myByte >> 1))但是这需要将单独的布尔值转换为一个字节(通过bitArray?),这似乎有点(双关语)笨拙... [编辑]对不起,应该是 if(myByte & (myByte - 1)) [/ edit]
注意:这当然非常接近经典的"人口数量","横向增加"或"汉明重量"编程问题 - 但不完全相同.我不需要知道有多少位被设置,只要它不止一个.我希望有一种更简单的方法来实现这一目标.
与我的其他问题相关,请帮我调试"未知模块中发生未处理的类型'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) 我的处理器(Intel i7)支持POPCNT instruction,我想从我的C#应用程序中调用它.这可能吗?
我相信我在某个地方读到它不是,但如果它发现它可用,JIT会调用它但是我必须调用哪个函数可以用这样的指令代替?
Popcount在一个循环中被调用了数百万次,所以我希望能够在可能的情况下进行CPU优化.