bitmap
简介
base linux-5.4
bitmap
实践
头文件
#include <linux/bitmap.h>
与/或/非/异或/与非操作
void bitmap_test(void)
{
unsigned long dst, src1, src2;
unsigned int nbits;
src1 = 0x2345;
src2 = 0xff;
nbits = 12;
bitmap_and(&dst, &src1, &src2, nbits); // 与操作
printk("bitmap: 0x%lx and 0x%lx\t = 0x%lx\n", src1, src2, dst);
bitmap_or(&dst, &src1, &src2, nbits); // 或操作
printk("bitmap: 0x%lx or 0x%lx\t = 0x%lx\n", src1, src2, dst);
bitmap_xor(&dst, &src1, &src2, nbits); // 异或操作
printk("bitmap: 0x%lx xor 0x%lx\t = 0x%lx\n", src1, src2, dst);
bitmap_complement(&dst, &src2, nbits); // 非操作
printk("bitmap: 0x%lx complement\t = 0x%lx\n", src2, dst);
nbits = 16;
bitmap_andnot(&dst, &src1, &src2, nbits); // 与非操作
printk("bitmap: 0x%lx andnot 0x%lx\t = 0x%lx\n", src1, src2, dst);
}
执行后,如下:
bitmap: 0x2345 and 0xff = 0x45
bitmap: 0x2345 or 0xff = 0x23ff
bitmap: 0x2345 xor 0xff = 0x23ba
bitmap: 0xff complement = 0xffffff00
bitmap: 0x2345 andnot 0xff = 0x2300
置位、清零、填充操作
void bitmap_test(void)
{
unsigned long dst, src1, src2;
unsigned int nbits, start;
src2 = 0xff;
start = 9;
nbits = 4;
bitmap_set(&src2, start, nbits); // 置位操作
printk("bitmap: 0xff set 9~12 bits\t = 0x%lx\n", src2);
src2 = 0xff;
start = 5;
nbits = 3;
bitmap_clear(&src2, start, nbits); // 清零操作
printk("bitmap: 0xff clear 5~7 bits\t = 0x%lx\n", src2);
src2 = 0x20;
nbits = 32;
bitmap_fill(&src2, nbits); // 填充操作
printk("bitmap: 0x20 fill\t = 0x%lx\n", src2);
}
执行后,如下:
bitmap: 0xff set 9~12 bits = 0x1eff
bitmap: 0xff clear 5~7 bits = 0x1f
bitmap: 0x20 fill = 0xffffffff
位移操作
void bitmap_test(void)
{
unsigned long dst, src1, src2;
unsigned int nbits, shift;
src2 = 0x12345678;
nbits = 32;
shift = 4;
bitmap_shift_left(&dst, &src2, shift, nbits); // 左移操作
printk("bitmap: 0x%lx shift left 4 bits\t = 0x%lx\n", src2, dst);
bitmap_shift_right(&dst, &src2, shift, nbits); // 右移操作
printk("bitmap: 0x%lx shift right 4 bits\t = 0x%lx\n", src2, dst);
}
执行后,如下:
bitmap: 0x12345678 shift left 4 bits = 0x23456780
bitmap: 0x12345678 shift right 4 bits = 0x1234567
遍历操作
void bitmap_test(void)
{
unsigned long dst, src1, src2, bit;
unsigned int nbits;
src2 = 0xf0;
nbits = 8;
bit = 0 ;
for_each_clear_bit(bit, &src2, nbits) // 遍历清零位操作
printk("bitmap: 0x%lx bit %ld is 0\n", src2, bit);
for_each_set_bit(bit, &src2, nbits) // 遍历置位操作
printk("bitmap: 0x%lx bit %ld is 1\n", src2, bit);
}
执行后,如下:
bitmap: 0xf0 bit 0 is 0
bitmap: 0xf0 bit 1 is 0
bitmap: 0xf0 bit 2 is 0
bitmap: 0xf0 bit 3 is 0
bitmap: 0xf0 bit 4 is 1
bitmap: 0xf0 bit 5 is 1
bitmap: 0xf0 bit 6 is 1
bitmap: 0xf0 bit 7 is 1
其余操作
void bitmap_test(void)
{
unsigned long dst, src1, src2;
unsigned int nbits;
src2 = 0xff00;
nbits = 8;
if(bitmap_empty(&src2, nbits)) // 判断是否为空
printk("bitmap: 0x%lx low %d bits is empty\n", src2, nbits);
else
printk("bitmap: 0x%lx low %d bits isn't empty\n", src2, nbits);
src1 = 0x1234;
src2 = 0xff34;
nbits = 8;
if(bitmap_equal(&src1, &src2, nbits)) // 判断是否相等
printk("bitmap: 0x%lx compare 0x%lx, low %d bits is equal\n",
src1, src2, nbits);
else
printk("bitmap: 0x%lx compare 0x%lx, low %d bits isn't equal\n",
src1, src2, nbits);
}
执行后,如下:
bitmap: 0xff00 low 8 bits is empty
bitmap: 0x1234 compare 0xff34, low 8 bits is equal
Last updated
Was this helpful?