将数值上调/下调为2的已知次幂的倍数

作者:追风剑情 发布于:2017-11-14 21:55 分类:Algorithms

示例

  1. using System;
  2.  
  3. namespace Test4
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. int x1 = 756;
  10. int x2 = -756;
  11.  
  12. for (int i = 3; i <= 10; i++)
  13. {
  14. Console.WriteLine("x1={0}, 上调为{1}的倍数={2}, 下调为{1}的倍数={3}", x1, Math.Pow(2, i), CMath.CeilingPow2(x1, i), CMath.FloorPow2(x1, i));
  15. Console.WriteLine("x2={0}, 上调为{1}的倍数={2}, 下调为{1}的倍数={3}", x2, Math.Pow(2, i), CMath.CeilingPow2(x2, i), CMath.FloorPow2(x2, i));
  16. Console.WriteLine();
  17. }
  18.  
  19. Console.Read();
  20. }
  21. }
  22.  
  23. public class CMath
  24. {
  25. /// <summary>
  26. /// 将数值上调为2的已知次幂的倍数
  27. /// 上调: 向正无穷方向取整
  28. /// </summary>
  29. /// <param name="x">输入值</param>
  30. /// <param name="pow">2的指数</param>
  31. /// <returns></returns>
  32. public static int CeilingPow2(int x, int pow)
  33. {
  34. //两种写法
  35. //return (x + (1<<pow)-1) & -(1<<pow);
  36. return x + (-x & ((1<<pow)-1) );
  37. }
  38.  
  39. /// <summary>
  40. /// 将数值下调为2的已知次幂的倍数
  41. /// 下调: 向负无穷方向取整
  42. /// </summary>
  43. /// <param name="x">输入值</param>
  44. /// <param name="pow">2的指数</param>
  45. /// <returns></returns>
  46. public static int FloorPow2(int x, int pow)
  47. {
  48. //两种写法
  49. //return (x >> pow) << pow;
  50. return x & -(1<<pow);
  51. }
  52. }
  53. }

运行测试

1111.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号