代码之家  ›  专栏  ›  技术社区  ›  serhio

负到-1,0到0,正到1

  •  3
  • serhio  · 技术社区  · 15 年前

    MyEnum (Neg -1; None 0; Pos 1)

    CompareTo() 初始化该枚举的对象。

    性能最好的 如何在.NET中执行(负到-1,0到0,正到1)?

    注意。

    9 回复  |  直到 13 年前
        1
  •  13
  •   Henrik    15 年前

    看一看 Math.Sign

        2
  •  11
  •   knittl    15 年前

    Math.Sign 在.net框架中

        3
  •  10
  •   stevehipwell    15 年前

    Math.Sign . 但是,如果您对.Net框架在幕后做什么感兴趣,下面的代码已经从Reflector中出来了。

    public static int Sign(int value)
    {
      if (value < 0)
      {
        return -1;
      }
      if (value > 0)
      {
        return 1;
      }
      return 0;
    }
    
        4
  •  4
  •   mbeckish    15 年前
    Math.Sign(value)
    
        5
  •  3
  •   GvS    15 年前

    比较结果为负、零或正。如果你看其他答案,Math.Sign使用2个If语句返回int。

    (如果这不是家庭作业,我会给出一个代码示例,但你应该从中学习)。

    在那之后,测试它,看看什么是最有效的。

        6
  •  3
  •   serhio    15 年前

    测试结果(双核,x86):

    ''''''''''''''''''''' DEBUG MODE '''
    = 1 =
    Division took    00:00:06.2482408 ms
    BuiltInSign took 00:00:05.0293383 ms <<<
    BitTestSign took 00:00:05.2092181 ms
    CustomSign took  00:00:05.2512802 ms
    
    = 2 =
    Division took    00:00:06.2477787 ms
    BuiltInSign took 00:00:05.0330921 ms <<<
    BitTestSign took 00:00:05.2114098 ms
    CustomSign took  00:00:05.2556966 ms
    
    = 3 =
    Division took    00:00:06.2506690 ms
    BuiltInSign took 00:00:05.0388615 ms <<<
    BitTestSign took 00:00:05.2306954 ms
    CustomSign took  00:00:05.2512391 ms
    
    
    ''''''''''''''''''' RELEASE MODE '''
    = 1 =
    Division took    00:00:01.0974078 ms
    BuiltInSign took 00:00:00.3195232 ms
    BitTestSign took 00:00:00.6392142 ms
    CustomSign took  00:00:00.3194230 ms <<<
    
    = 2 =
    Division took    00:00:01.1007138 ms
    BuiltInSign took 00:00:00.3197784 ms <<<
    BitTestSign took 00:00:00.6395294 ms
    CustomSign took  00:00:00.3202774 ms
    
    = 3 =
    Division took    00:00:01.0977087 ms
    BuiltInSign took 00:00:00.3194622 ms <<<
    BitTestSign took 00:00:00.6394220 ms
    CustomSign took  00:00:00.3201607 ms
    

    代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Stopwatch sw = new Stopwatch();
            MyEnum myEnum = MyEnum.None;
    
            const int max = 100000000;
    
            sw.Start();
            for (int i = -max; i < max; i++)
            {
                myEnum = Division(i);
            }
            sw.Stop();
            Console.WriteLine("Division took {0} ms", sw.Elapsed);
            sw.Reset();
    
            sw.Start();
            for (int i = -max; i < max; i++)
            {
                myEnum = BuiltInSign(i);
            }
            sw.Stop();
            Console.WriteLine("BuiltInSign took {0} ms", sw.Elapsed);
            sw.Reset();
    
            sw.Start();
            for (int i = -max; i < max; i++)
            {
                myEnum = BitTestSign(i);
            }
            sw.Stop();
            Console.WriteLine("BitTestSign took {0} ms", sw.Elapsed);
            sw.Reset();
    
            sw.Start();
            for (int i = -max; i < max; i++)
            {
                myEnum = CustomSign(i);
            }
            sw.Stop();
            Console.WriteLine("CustomSign took {0} ms", sw.Elapsed);
        }
    
        private MyEnum Division(int value)
        {
            return value == 0 ? 0 : (MyEnum)(value / Math.Abs(value));
        }
    
        private MyEnum BuiltInSign(int value)
        {
            return (MyEnum)Math.Sign(value);
        }
    
        private MyEnum CustomSign(int value)
        {
            if (value < 0)
                return MyEnum.Neg;
    
            if (value > 0)
                return MyEnum.Pos;
    
            return MyEnum.None;
        }
    
        MyEnum BitTestSign(int value)
        {
            // Shifts the variable over 31 places, 
            // if the MSB is 1, the statement is true
            if ((value >> 31) == 1)
            {
                return MyEnum.Neg;
            }
            else
            {
                if (value == 0)
                {
                    return MyEnum.None;
                }
                else
                {
                    return MyEnum.Pos;
                }
            }
        }
    
        private enum MyEnum
        {
            Pos = 1,
            None = 0,
            Neg = -1
        }
    }
    
        7
  •  1
  •   Donnie    15 年前

    伪代码:

    if(num == 0)
      return 0;
    
    if(num has msb set)
      return -1;
    
    return 1;
    
        8
  •  0
  •   Turing Complete    15 年前

    如果我理解正确的话,您希望返回-1表示负值,0表示零值,1表示正值。

    我同意:

    public static MyEnum GetSign(int value)
    {
        return value == 0 ? 0 : (MyEnum)(value / Math.Abs(value));
    }
    

    还是我做错什么了?

        9
  •  0
  •   Jan Gorzny    15 年前

    int Sign(int value){
        if (value >> 31) { //Shifts the variable over 31 places, if the MSB is 1, the statement is true
             return -1;
        } else {
            if (value == 0){
                return 0;
            } else {
                return 1;
            }
        }  }  
    

    (例如编辑)

    推荐文章