BitVector.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:5k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using Directory = Lucene.Net.Store.Directory;
  18. using IndexInput = Lucene.Net.Store.IndexInput;
  19. using IndexOutput = Lucene.Net.Store.IndexOutput;
  20. namespace Lucene.Net.Util
  21. {
  22. /// <summary>Optimized implementation of a vector of bits.  This is more-or-less like
  23. /// java.util.BitSet, but also includes the following:
  24. /// <ul>
  25. /// <li>a count() method, which efficiently computes the number of one bits;</li>
  26. /// <li>optimized read from and write to disk;</li>
  27. /// <li>inlinable get() method;</li>
  28. /// </ul>
  29. /// </summary>
  30. /// <author>  Doug Cutting
  31. /// </author>
  32. /// <version>  $Id: BitVector.java 150536 2004-09-28 18:15:52Z cutting $
  33. /// </version>
  34. public sealed class BitVector
  35. {
  36. private byte[] bits;
  37. private int size;
  38. private int count = - 1;
  39. /// <summary>Constructs a vector capable of holding <code>n</code> bits. </summary>
  40. public BitVector(int n)
  41. {
  42. size = n;
  43. bits = new byte[(size >> 3) + 1];
  44. }
  45. /// <summary>Sets the value of <code>bit</code> to one. </summary>
  46. public void  Set(int bit)
  47. {
  48. bits[bit >> 3] |= (byte) (1 << (bit & 7));
  49. count = - 1;
  50. }
  51. /// <summary>Sets the value of <code>bit</code> to zero. </summary>
  52. public void  Clear(int bit)
  53. {
  54. bits[bit >> 3] &= (byte) (~ (1 << (bit & 7)));
  55. count = - 1;
  56. }
  57. /// <summary>Returns <code>true</code> if <code>bit</code> is one and
  58. /// <code>false</code> if it is zero. 
  59. /// </summary>
  60. public bool Get(int bit)
  61. {
  62. return (bits[bit >> 3] & (1 << (bit & 7))) != 0;
  63. }
  64. /// <summary>Returns the number of bits in this vector.  This is also one greater than
  65. /// the number of the largest valid bit number. 
  66. /// </summary>
  67. public int Size()
  68. {
  69. return size;
  70. }
  71. /// <summary>Returns the total number of one bits in this vector.  This is efficiently
  72. /// computed and cached, so that, if the vector is not changed, no
  73. /// recomputation is done for repeated calls. 
  74. /// </summary>
  75. public int Count()
  76. {
  77. // if the vector has been modified
  78. if (count == - 1)
  79. {
  80. int c = 0;
  81. int end = bits.Length;
  82. for (int i = 0; i < end; i++)
  83. c += BYTE_COUNTS[bits[i] & 0xFF]; // sum bits per byte
  84. count = c;
  85. }
  86. return count;
  87. }
  88. private static readonly byte[] BYTE_COUNTS = new byte[]{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
  89. /// <summary>Writes this vector to the file <code>name</code> in Directory
  90. /// <code>d</code>, in a format that can be read by the constructor {@link
  91. /// #BitVector(Directory, String)}.  
  92. /// </summary>
  93. public void  Write(Directory d, System.String name)
  94. {
  95. IndexOutput output = d.CreateOutput(name);
  96. try
  97. {
  98. output.WriteInt(Size()); // write size
  99. output.WriteInt(Count()); // write count
  100. output.WriteBytes(bits, bits.Length); // write bits
  101. }
  102. finally
  103. {
  104. output.Close();
  105. }
  106. }
  107. /// <summary>Constructs a bit vector from the file <code>name</code> in Directory
  108. /// <code>d</code>, as written by the {@link #write} method.
  109. /// </summary>
  110. public BitVector(Directory d, System.String name)
  111. {
  112. IndexInput input = d.OpenInput(name);
  113. try
  114. {
  115. size = input.ReadInt(); // read size
  116. count = input.ReadInt(); // read count
  117. bits = new byte[(size >> 3) + 1]; // allocate bits
  118. input.ReadBytes(bits, 0, bits.Length); // read bits
  119. }
  120. finally
  121. {
  122. input.Close();
  123. }
  124. }
  125. }
  126. }