Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有条件语句的情况下获取C中数字的符号_C#_R - Fatal编程技术网

C# 在没有条件语句的情况下获取C中数字的符号

C# 在没有条件语句的情况下获取C中数字的符号,c#,r,C#,R,出于好奇,有没有一种方法可以得到一个数字的符号,任何类型,但显然是一个有符号类型,而不仅仅是整数,使用一些位/屏蔽或其他类型的操作? 这不需要使用任何条件语句或调用Math.Sign函数 提前谢谢 编辑:我承认这是一个误导性的问题。我的想法更可能是这样的:得到相同的数学输出。符号或,简化得到0如果x 有没有一种方法可以得到一个数字的符号,而不仅仅是整数 不适用于任何数字类型,不适用。对于整数,可以测试最高有效位:如果是1,则数字为负数。从理论上讲,对于浮点数也可以这样做,但按位运算符不适用于浮点

出于好奇,有没有一种方法可以得到一个数字的符号,任何类型,但显然是一个有符号类型,而不仅仅是整数,使用一些位/屏蔽或其他类型的操作? 这不需要使用任何条件语句或调用Math.Sign函数

提前谢谢

编辑:我承认这是一个误导性的问题。我的想法更可能是这样的:得到相同的数学输出。符号或,简化得到0如果x 有没有一种方法可以得到一个数字的符号,而不仅仅是整数


不适用于任何数字类型,不适用。对于整数,可以测试最高有效位:如果是1,则数字为负数。从理论上讲,对于浮点数也可以这样做,但按位运算符不适用于浮点或双精度运算。

要仅获取符号,可以避免使用条件运算符,如下面在int32 struct的符号扩展中所示。然而,为了得到这个名字,我认为你不能避免条件运算符

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(0.Sign()); 
        Console.WriteLine(0.SignName());

        Console.WriteLine(12.Sign());
        Console.WriteLine(12.SignName());

        Console.WriteLine((-15).Sign());
        Console.WriteLine((-15).SignName());

        Console.ReadLine();
    }
}

public static class extensions
{
    public static string Sign(this int signedNumber)
    {
        return (signedNumber.ToString("+00;-00").Substring(0, 1));
    }

    public static string SignName(this int signedNumber)
    {
        return (signedNumber.ToString("+00;-00").Substring(0, 1)=="+"?"positive":"negative");
    }
}

这取决于您所针对的数值类型的类型

对于有符号的C和大多数计算机系统,使用所谓的表示法

这意味着符号存储在值的第一位

所以你可以像这样提取符号:

Int16 number = -2;
Int16 sign = (number & Int16.MinValue) >> 16;
Boolean isNegative = Convert.ToBoolean(sign);
请注意,到目前为止,我们还没有明确使用任何条件运算符

但是:你仍然不知道这个数字是否有符号

你问题的逻辑等价物:如果我的数字是负数,我怎么知道?明确要求使用条件运算符,因为问题毕竟是条件的

所以你将无法躲避:

if(isNegative) 
     doThis();
else
     doThat();
如果x==0,您将有一个divby0异常,您发布的代码如下:

int SignOf(x) {
    return (1+x-(x+1)%x)/x; }

这是一个适用于所有值类型int、float、double、decimal等的零安全解决方案:

(value.GetHashCode() >> 31) + 1;
输出:1=1,-1=0,0.5=1,-0.5=0,0=1

它也比1+x-x+1%x/x大约便宜10%;在C中,另外,如果值是整数,则可以删除GetHashCode函数调用,在这种情况下,1+x-x+1%x/x;价格上涨127%>>31+1;便宜56%

因为0是正数,所以正数的结果为1是不合逻辑的&0的结果为0。如果您可以参数化-0,您将得到0的输出

我知道GetHashCode是一个函数调用,但是C语言实现中函数的内部工作完全是算术的。基本上,GetHashCode函数读取内存部分,该部分将浮点类型存储为整数类型:

*((int*)&singleValue);
GetHashCode函数的工作原理我可以很快找到最好的源代码-

如果希望输出值为1,且符号与输入相同,请使用:

((float.GetHashCode() >> 31) * 2) + 1;
上述浮点方法比System.Math.Signfloat System.Math.Signfloat大约便宜39%,比System.Math.Signfloat大约贵65%。其中System.Math.Signfloat为float.NaN抛出异常,float.NaN.GetHashCode>>31*2+1;不会并且将返回-1而不是崩溃

或对于整数:

((int >> 31) * 2) + 1;

上面的整数方法比System.Math.Signint System.Math.Signint大约便宜56%。

您尝试过什么,是否尝试查找数字类型在内存中的存储方式?您是否尝试获取字节并执行逐位操作以获取符号位?你为什么不想要数学符号?方法X正是我想要的。如何在不调用方法X的情况下实现这一点?如果不解释为什么不想调用方法X,这样的问题是毫无意义的。如果没有任何条件语句,就无法检测数字i是有符号的还是无符号的。即使成功地执行了任何按位操作,也必须以某种方式执行条件语句。你为什么要避开它们?@Jusanne实际上,这取决于你要用结果做什么。让我们假设它适用于这样的赋值:x=x<0?0:x;在这种情况下,位符号可能很有用,不需要任何条件语句。谢谢Thomas,我也发现了这一点,但是没有办法绕过它吗?我在找那个:@ANVerona,据我所知不是。数学怎么了?符号?没什么!只是想知道是否有另外一种只使用算术和位逻辑的方法:找到结果了!谢谢你的帮助:谢谢奎师那。但是,如何避免一个函数调用,并使用一些简单的算法呢。我引用这句话是因为我认为需要一些位屏蔽和/或其他位操作:找到结果了!无论如何谢谢你的帮助:找到了结果!感谢您的帮助:
*((int*)&singleValue);
((float.GetHashCode() >> 31) * 2) + 1;
((int >> 31) * 2) + 1;