3 * Helper functions for bitmap.h.
5 * This source code is licensed under the GNU General Public License,
6 * Version 2. See the file COPYING for more details.
8 #include <linux/bitmap.h>
10 int __bitmap_weight(const unsigned long *bitmap
, int bits
)
12 int k
, w
= 0, lim
= bits
/BITS_PER_LONG
;
14 for (k
= 0; k
< lim
; k
++)
15 w
+= hweight_long(bitmap
[k
]);
17 if (bits
% BITS_PER_LONG
)
18 w
+= hweight_long(bitmap
[k
] & BITMAP_LAST_WORD_MASK(bits
));
23 void __bitmap_or(unsigned long *dst
, const unsigned long *bitmap1
,
24 const unsigned long *bitmap2
, int bits
)
27 int nr
= BITS_TO_LONGS(bits
);
29 for (k
= 0; k
< nr
; k
++)
30 dst
[k
] = bitmap1
[k
] | bitmap2
[k
];
33 size_t bitmap_scnprintf(unsigned long *bitmap
, int nbits
,
34 char *buf
, size_t size
)
36 /* current bit is 'cur', most recently seen range is [rbot, rtop] */
41 rbot
= cur
= find_first_bit(bitmap
, nbits
);
44 cur
= find_next_bit(bitmap
, nbits
, cur
+ 1);
45 if (cur
< nbits
&& cur
<= rtop
+ 1)
49 ret
+= scnprintf(buf
+ ret
, size
- ret
, ",");
53 ret
+= scnprintf(buf
+ ret
, size
- ret
, "%d", rbot
);
55 ret
+= scnprintf(buf
+ ret
, size
- ret
, "-%d", rtop
);
62 int __bitmap_and(unsigned long *dst
, const unsigned long *bitmap1
,
63 const unsigned long *bitmap2
, unsigned int bits
)
66 unsigned int lim
= bits
/BITS_PER_LONG
;
67 unsigned long result
= 0;
69 for (k
= 0; k
< lim
; k
++)
70 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
]);
71 if (bits
% BITS_PER_LONG
)
72 result
|= (dst
[k
] = bitmap1
[k
] & bitmap2
[k
] &
73 BITMAP_LAST_WORD_MASK(bits
));