C# 尽可能少地使用位移位、加法和减法乘以27

C# 尽可能少地使用位移位、加法和减法乘以27,c#,bit-manipulation,bit-shift,multiplication,C#,Bit Manipulation,Bit Shift,Multiplication,我最近对一份求职申请进行了一次C#技术评估,其中一个问题是: 问题11:实现函数intmult27(inta),以返回a乘以27的结果。仅使用以下功能(提供)执行此操作: SHL(a,b)将整数a的所有位向左移位b位 ADD(a,b)将两个整数相加,得到a+b SUB(a,b)减去两个整数得到a-b 使用尽可能少的函数调用,假设a始终是正整数 public class AnswerEleven { int SHL(int a, int b) { return a

我最近对一份求职申请进行了一次C#技术评估,其中一个问题是:

问题11:实现函数
intmult27(inta)
,以返回
a
乘以27的结果。仅使用以下功能(提供)执行此操作:

  • SHL(a,b)
    将整数
    a
    的所有位向左移位
    b
  • ADD(a,b)
    将两个整数相加,得到
    a+b
  • SUB(a,b)
    减去两个整数得到
    a-b
  • 使用尽可能少的函数调用,假设
    a
    始终是正整数

    public class AnswerEleven
    {
        int SHL(int a, int b)
        {
            return a << b;
        }
    
        int ADD(int a, int b)
        {
            return a + b;
        }
    
        int SUB(int a, int b)
        {
            return a - b;
        }
    
        public int Mult27(int a)
        {
    
        }
    }
    
    public class answer11
    {
    内部SHL(内部a、内部b)
    {
    返回一个这个怎么样:

    public int Mult27(int a)
    {
        return ADD(ADD(SHL(a, 4), SHL(a, 3)), SUB(SHL(a, 2), a));
    }
    
    var ae = new AnswerEleven();
    Console.WriteLine(ae.Mult27(1));
    Console.WriteLine(ae.Mult27(2));
    
    这就给出了
    27
    54

    这个怎么样:

    public int Mult27(int a)
    {
        return ADD(ADD(SHL(a, 4), SHL(a, 3)), SUB(SHL(a, 2), a));
    }
    
    var ae = new AnswerEleven();
    Console.WriteLine(ae.Mult27(1));
    Console.WriteLine(ae.Mult27(2));
    

    这就给出了将整数解构为2的幂的方法。下面是一个简单的方法:

    27x=32x-5x=32x-4x-x

    因此你可以写作

    public int Mult27(int a)
    {
        return SUB(SUB(SHL(a, 5), SHL(a, 2)), a);
    }
    

    这只使用四个调用您允许的函数。我相信很难达到最高点。

    可以通过多种方式将整数解构为2的幂。下面是一个简单的方法:

    public int Mult27(int a)
    {
        a = ADD(a, SHL(a, 1));    // or SUB(SHL(a, 2), a) → a = 3a
        return ADD(a, SHL(a, 3)); // 3a + 8*3a = 27a
    }
    
    27x=32x-5x=32x-4x-x

    因此你可以写作

    public int Mult27(int a)
    {
        return SUB(SUB(SHL(a, 5), SHL(a, 2)), a);
    }
    
    这只使用四个调用您允许的函数。我相信很难超越

    public int Mult27(int a)
    {
        a = ADD(a, SHL(a, 1));    // or SUB(SHL(a, 2), a) → a = 3a
        return ADD(a, SHL(a, 3)); // 3a + 8*3a = 27a
    }
    
    这有一个很好的特性,它避免了移位5时的溢出,就像扩展27x=32x-5x时一样

    这里有一个备用版本,它也使用4个调用

    int a4 = SHL(a, 2);                 // a4 = a*4
    return SUB(SUB(SHL(a4, 3), a4), a); // a4*8 - a4 - a
    
    这有一个很好的特性,它避免了移位5时的溢出,就像扩展27x=32x-5x时一样

    这里有一个备用版本,它也使用4个调用

    int a4 = SHL(a, 2);                 // a4 = a*4
    return SUB(SUB(SHL(a4, 3), a4), a); // a4*8 - a4 - a
    

    例如:*32-5?(
    返回SHL(a,5)-SHL(a,2)-a;
    返回SUB(SUB(SHL(a,5),SHL(a,2)),a);
    ),它只有四个调用。提示:您可以乘以6,乘以4和2,然后将结果相加(4a+2a=6a)。或者使用8a-2a=6a注意,如果输入太大,
    *32-5
    将溢出:*32-5?(
    返回SHL(a,5)-SHL(a,2)-a;
    返回SUB(SUB(SHL(a,5),SHL(a,2));
    ),它只有四个调用。提示:您可以乘以6,乘以4和2,再加上结果(4a+2a=6a)。或者使用8a-2a=6A注意,如果输入较大,则
    *32-5
    将溢出,这对于我们这些无知者来说相当于执行
    ((a*16)+(a*8))+((a*4)-a)
    啊,对了,把27分解成2的幂的倍数,得到a*28,然后减去a的最后一个值。非常有用,谢谢!这对我们无知者来说相当于做
    ((a*16)+(a*8))+((a*4)-a)
    啊,对了,将27除以2的幂的倍数得到a*28,然后减去a的最后一个值。非常有用,谢谢!啊,我明白了,现在看起来很明显。使用位移位得到32*x,然后在位移位后再减去5x。至少现在我知道下一次了。谢谢!四次调用是最佳的,但我唯一的证据是exh奥斯汀枚举啊,我明白了,现在看起来很明显。使用位移位得到32*x,然后在位移位后再减去5倍。至少现在我知道下一次了。谢谢!四次调用是最佳的,但我唯一的证据是穷举枚举