统计值为1的位元数

作者:追风剑情 发布于:2019-3-15 12:42 分类:Algorithms

示例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ConsoleApp1
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. int x = 999;
  13. Console.WriteLine("统计结果: {0}", StatBit1Count(x) );
  14. Console.Read();
  15. }
  16.  
  17. public static int StatBit1Count(int x)
  18. {
  19. Console.WriteLine("统计值为1的位元数");
  20. Console.WriteLine("x={0}={1}", x, IntToBinary(x));
  21. Console.WriteLine("打印一些常量值");
  22. Console.WriteLine("0x55555555={0}", IntToBinary(0x55555555));
  23. Console.WriteLine("0x33333333={0}", IntToBinary(0x33333333));
  24. Console.WriteLine("0x0F0F0F0F={0}", IntToBinary(0x0F0F0F0F));
  25. Console.WriteLine("0x00FF00FF={0}", IntToBinary(0x00FF00FF));
  26. Console.WriteLine("0x0000FFFF={0}", IntToBinary(0x0000FFFF));
  27. Console.WriteLine();
  28.  
  29. // 分治策略
  30. // 先统计相邻2位的1个数,再统计相邻4位的1个数
  31. // 再统计相邻8位的1个数,再统计相邻16位的1个数
  32.  
  33. // 打印过程
  34. Console.WriteLine("步骤1:");
  35. int i1 = (x & 0x55555555);
  36. int i2 = ((x >> 1) & 0x55555555);
  37. int i = i1 + i2;
  38. Console.WriteLine(" {0}={1} \n+{2}={3}", IntToBinary(i1), i1, IntToBinary(i2), i2);
  39. Console.WriteLine(" -----------------------------------");
  40. Console.WriteLine(" {0}={1}", IntToBinary(i), i);
  41. // --end
  42.  
  43. x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
  44.  
  45. // 打印过程
  46. Console.WriteLine("步骤2:");
  47. i1 = (x & 0x33333333);
  48. i2 = ((x >> 2) & 0x33333333);
  49. i = i1 + i2;
  50. Console.WriteLine(" {0}={1} \n+{2}={3}", IntToBinary(i1), i1, IntToBinary(i2), i2);
  51. Console.WriteLine(" -----------------------------------");
  52. Console.WriteLine(" {0}={1}", IntToBinary(i), i);
  53. // --end
  54.  
  55. x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
  56.  
  57. // 打印过程
  58. Console.WriteLine("步骤3:");
  59. i1 = (x & 0x0F0F0F0F);
  60. i2 = ((x >> 4) & 0x0F0F0F0F);
  61. i = i1 + i2;
  62. Console.WriteLine(" {0}={1} \n+{2}={3}", IntToBinary(i1), i1, IntToBinary(i2), i2);
  63. Console.WriteLine(" -----------------------------------");
  64. Console.WriteLine(" {0}={1}", IntToBinary(i), i);
  65. // --end
  66.  
  67. x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
  68.  
  69. // 打印过程
  70. Console.WriteLine("步骤4");
  71. i1 = (x & 0x00FF00FF);
  72. i2 = ((x >> 8) & 0x00FF00FF);
  73. i = i1 + i2;
  74. Console.WriteLine(" {0}={1} \n+{2}={3}", IntToBinary(i1), i1, IntToBinary(i2), i2);
  75. Console.WriteLine(" -----------------------------------");
  76. Console.WriteLine(" {0}={1}", IntToBinary(i), i);
  77. // --end
  78.  
  79. x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
  80.  
  81. // 打印过程
  82. Console.WriteLine("步骤5:");
  83. i1 = (x & 0x0000FFFF);
  84. i2 = ((x >> 16) & 0x0000FFFF);
  85. i = i1 + i2;
  86. Console.WriteLine(" {0}={1} \n+{2}={3}", IntToBinary(i1), i1, IntToBinary(i2), i2);
  87. Console.WriteLine(" -----------------------------------");
  88. Console.WriteLine(" {0}={1}", IntToBinary(i), i);
  89. // --end
  90.  
  91. x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF);
  92.  
  93. return x;
  94. }
  95.  
  96. public static string IntToBinary(int val, int bits = 32)
  97. {
  98. string final = "";
  99.  
  100. for (int i = bits; i > 0;)
  101. {
  102. if (i == 8 || i == 16 || i == 24) final += " ";
  103. final += ((val & (1 << --i)) != 0) ? '1' : '0';
  104. }
  105. return final;
  106. }
  107. }
  108. }

运行测试

111.png

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号