bitops.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/hfs/bitops.c
  3.  *
  4.  * Copyright (C) 1996  Paul H. Hargrove
  5.  * This file may be distributed under the terms of the GNU General Public License.
  6.  *
  7.  * This file contains functions to handle bitmaps in "left-to-right"
  8.  * bit-order such that the MSB of a 32-bit big-endian word is bit 0.
  9.  * (This corresponds to bit 7 of a 32-bit little-endian word.)
  10.  *
  11.  * I have tested and confirmed that the results are identical on the
  12.  * Intel x86, PowerPC and DEC Alpha processors.
  13.  *
  14.  * "XXX" in a comment is a note to myself to consider changing something.
  15.  */
  16. #include "hfs.h"
  17. /*================ Global functions ================*/
  18. /*
  19.  * hfs_find_zero_bit()
  20.  *
  21.  * Description:
  22.  *  Given a block of memory, its length in bits, and a starting bit number,
  23.  *  determine the number of the first zero bits (in left-to-right ordering)
  24.  *  in that range.
  25.  *
  26.  *  Returns >= 'size' if no zero bits are found in the range.
  27.  *
  28.  *  Accesses memory in 32-bit aligned chunks of 32-bits and thus
  29.  *  may read beyond the 'size'th bit.
  30.  */
  31. hfs_u32 hfs_find_zero_bit(const hfs_u32 *start, hfs_u32 size, hfs_u32 offset)
  32. {
  33. const hfs_u32 *end   = start + ((size + 31) >> 5);
  34. const hfs_u32 *curr  = start + (offset >> 5);
  35. int bit = offset % 32;
  36. if (offset < size) {
  37. /* scan the first partial hfs_u32 for zero bits */
  38. if (bit != 0) {
  39. do {
  40. if (!hfs_test_bit(bit, curr)) {
  41. goto done;
  42. }
  43. ++bit;
  44. } while (bit < 32);
  45. bit = 0;
  46. ++curr;
  47. }
  48. /* scan complete hfs_u32s for the first zero bit */
  49. while (curr < end) {
  50. if (*curr == ~((hfs_u32)0)) {
  51. ++curr;
  52. } else {
  53. while (hfs_test_bit(bit, curr)) {
  54. ++bit;
  55. }
  56. break;
  57. }
  58. }
  59. done:
  60. bit |= (curr - start) << 5;
  61. return bit;
  62. } else {
  63. return size;
  64. }
  65. }
  66. /*
  67.  * hfs_count_zero_bits()
  68.  *
  69.  * Description:
  70.  *  Given a block of memory, its length in bits, and a starting bit number,
  71.  *  determine the number of consecutive zero bits (in left-to-right ordering)
  72.  *  in that range.
  73.  *
  74.  *  Accesses memory in 32-bit aligned chunks of 32-bits and thus
  75.  *  may read beyond the 'size'th bit.
  76.  */
  77. hfs_u32 hfs_count_zero_bits(const hfs_u32 *start, hfs_u32 size, hfs_u32 offset)
  78. {
  79. const hfs_u32 *end   = start + ((size + 31) >> 5);
  80. const hfs_u32 *curr  = start + (offset >> 5);
  81. int bit = offset % 32;
  82. if (offset < size) {
  83. /* scan the first partial hfs_u32 for one bits */
  84. if (bit != 0) {
  85. do {
  86. if (hfs_test_bit(bit, curr)) {
  87. goto done;
  88. }
  89. ++bit;
  90. } while (bit < 32);
  91. bit = 0;
  92. ++curr;
  93. }
  94. /* scan complete hfs_u32s for the first one bit */
  95. while (curr < end) {
  96. if (*curr == ((hfs_u32)0)) {
  97. ++curr;
  98. } else {
  99. while (!hfs_test_bit(bit, curr)) {
  100. ++bit;
  101. }
  102. break;
  103. }
  104. }
  105. done:
  106. bit |= (curr - start) << 5;
  107. if (bit > size) {
  108. bit = size;
  109. }
  110. return bit - offset;
  111. } else {
  112. return 0;
  113. }
  114. }