布尔值到整数的转换

本文关键字:转换 整数 布尔值 | 更新日期: 2023-09-27 18:26:16

有没有一种方法可以在没有条件语句(例如if语句)的情况下从布尔转换为整数?

int intValue = boolValue ? 1 : 0;

布尔值到整数的转换

不,没有。您可以将这个条件隐藏在Convert.ToInt之类的其他方法调用后面,或者更喜欢实际的if之类的不同语法,但最终会有您的条件。

int intValue = Convert.ToInt32(boolValue));

尽管nvoigt的答案完全正确,但我可以再给你举几个例子,只是为了好玩

从来没有!永远不要使用此代码!它只是为了好玩或解决与(好)朋友的纠纷!)

首先,方法GetHashCode发挥了神奇的作用(作为实现细节):

bool b = true;
int i = b.GetHashCode();

如果你想要一些更深奥的方法。。不客气):

bool b = true;
int i = ~(b.ToString()[0] / 2) & 1;

记住!从来没有!

使用Convert.ToInt32(boolValue)

一些可以玩的东西,尽管我不推荐它(需要为项目启用不安全代码):

internal static class Extensions
{
    unsafe static public Int32 ToInt32(this bool value)
    {
        void* b = &value;
        return *(Int32*)b;
    }
}

这样使用:

var b = true;
Console.WriteLine($"{b}'t{b.ToInt32()}");
b = false;
Console.WriteLine($"{b}'t{b.ToInt32()}");

显示器:

True    1
False   0

它比?慢:操作员,但是:

var b = true;
int i = 0;
int iterations = 100_000_000;
Stopwatch sw = Stopwatch.StartNew();
for (int ndx = 0; ndx < iterations; ndx++)
{
    i = b ? 1 : 0;
    b = !b;
}
sw.Stop();
Console.WriteLine($"?:'t{sw.ElapsedMilliseconds} {i}");
b = true;
sw.Restart();
for (int ndx = 0; ndx < iterations; ndx++)
{
    i = b.ToInt32();
    b = !b;
}
sw.Stop();
Console.WriteLine($"cast't{sw.ElapsedMilliseconds} {i}");

我的系统为?报告85毫秒:操作,对于不安全的方法为180ms。