C# 尽可能少地使用位移位、加法和减法乘以27
我最近对一份求职申请进行了一次C#技术评估,其中一个问题是: 问题11:实现函数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
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的幂。下面是一个简单的方法:
27x=32x-5x=32x-4x-x 因此你可以写作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 }
这只使用四个调用您允许的函数。我相信很难超越public int Mult27(int a) { return SUB(SUB(SHL(a, 5), SHL(a, 2)), a); }
这有一个很好的特性,它避免了移位5时的溢出,就像扩展27x=32x-5x时一样 这里有一个备用版本,它也使用4个调用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
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;
),它只有四个调用。提示:您可以乘以6,乘以4和2,然后将结果相加(4a+2a=6a)。或者使用8a-2a=6a注意,如果输入太大,返回SUB(SUB(SHL(a,5),SHL(a,2)),a);
将溢出:*32-5?(*32-5
或返回SHL(a,5)-SHL(a,2)-a;
),它只有四个调用。提示:您可以乘以6,乘以4和2,再加上结果(4a+2a=6a)。或者使用8a-2a=6A注意,如果输入较大,则返回SUB(SUB(SHL(a,5),SHL(a,2));
将溢出,这对于我们这些无知者来说相当于执行*32-5
啊,对了,把27分解成2的幂的倍数,得到a*28,然后减去a的最后一个值。非常有用,谢谢!这对我们无知者来说相当于做((a*16)+(a*8))+((a*4)-a)
啊,对了,将27除以2的幂的倍数得到a*28,然后减去a的最后一个值。非常有用,谢谢!啊,我明白了,现在看起来很明显。使用位移位得到32*x,然后在位移位后再减去5x。至少现在我知道下一次了。谢谢!四次调用是最佳的,但我唯一的证据是exh奥斯汀枚举啊,我明白了,现在看起来很明显。使用位移位得到32*x,然后在位移位后再减去5倍。至少现在我知道下一次了。谢谢!四次调用是最佳的,但我唯一的证据是穷举枚举((a*16)+(a*8))+((a*4)-a)