位数组
看了《C和指针》后,参考网上的代码自己实现的版本(真的不是纯抄的)。这是5.9 编程练习的第4题。
头文件bits.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* bits.h */ #ifndef BITS_H_INCLUDED #define BITS_H_INCLUDED void set_bit( char bit_array[], unsigned int bit_number); void clear_bit( char bit_array[], unsigned int bit_number); void reverse_bit( char bit_array[], unsigned int bit_number); void assign_bit( char bit_array[], unsigned int bit_number, int value); int test_bit( char bit_array[], unsigned int bit_number); #endif // BITS_H_INCLUDED |
源代码bits.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /* bits.c */ #include "bits.h" #define BASE 8 #define SHIFT 3 #define MASK 7 void set_bit( char bit_array[], unsigned int bit_number) { bit_array[bit_number >> SHIFT] |= 1 << (bit_number & MASK); } void clear_bit( char bit_array[], unsigned int bit_number) { bit_array[bit_number >> SHIFT] &= ~(1 << (bit_number & MASK)); } void reverse_bit( char bit_array[], unsigned int bit_number) { bit_array[bit_number >> SHIFT] ^= 1 << (bit_number & MASK); } void assign_bit( char bit_array[], unsigned int bit_number, int value) { if (value == 1) { set_bit(bit_array, bit_number); } else if (value == 0) { clear_bit(bit_array, bit_number); } } int test_bit( char bit_array[], unsigned int bit_number) { return (bit_array[bit_number >> SHIFT] & (1 << (bit_number & MASK))) >> (bit_number & MASK); } |
测试用例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "bits.h" int main() { char bits[128]; memset (bits, 0, sizeof (bits)); set_bit(bits, 234); printf ( "%d\n" , test_bit(bits, 234)); clear_bit(bits, 234); printf ( "%d\n" , test_bit(bits, 234)); reverse_bit(bits, 235); printf ( "%d\n" , test_bit(bits, 235)); reverse_bit(bits, 235); printf ( "%d\n" , test_bit(bits, 235)); assign_bit(bits, 1024, 1); printf ( "%d\n" , test_bit(bits, 1024)); return 0; } |
答案版本:
头文件bitarray.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #ifndef BITARRAY_H_INCLUDED #define BITARRAY_H_INCLUDED /* * Prototypes for a suite of functions that implement an array of bits in a * character array. */ // Set a specific bit void set_bit( char bit_array[], unsigned int bit_number); // Clear a specific bit void clear_bit( char bit_array[], unsigned int bit_number); // Assign a value to a bit void assign_bit( char bit_array[], unsigned int bit_number, int value); // Test a specific bit int test_bit( char bit_array[], unsigned int bit_number); #endif // BITARRAY_H_INCLUDED |
源代码bitarray.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /* bitarray.cpp -- Implements an array of bits in a character array. */ #include <limits.h> #include "bitarray.h" static unsigned int character_offset(unsigned int bit_number); static unsigned int bit_offset(unsigned int bit_number); void set_bit( char bit_array[], unsigned int bit_number) { bit_array[character_offset(bit_number)] |= 1 << bit_offset(bit_number); } void clear_bit( char bit_array[], unsigned int bit_number) { bit_array[ character_offset( bit_number ) ] &= ~(1 << bit_offset(bit_number)); } void assign_bit( char bit_array[], unsigned int bit_number, int value) { if (value != 0) set_bit(bit_array, bit_number); else clear_bit(bit_array, bit_number); } int test_bit( char bit_array[], unsigned int bit_number) { return (bit_array[ character_offset( bit_number ) ] & 1 << bit_offset( bit_number )) != 0; } static unsigned int character_offset(unsigned int bit_number) { return bit_number / CHAR_BIT; } static unsigned int bit_offset(unsigned int bit_number) { return bit_number % CHAR_BIT; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步