#include <stdio.h> #include <ctype.h> #include <assert.h> #include <string.h> #define TRUE 1 #define FALSE 0 void printupper(void) { int ch; while ((ch = getchar()) != EOF) putchar(tolower(ch)); } void entry(void) { int ch; while ((ch = getchar()) != EOF) { if (isalpha(ch)) { putchar((toupper(ch)-'A'+13) % 26 + 'A'); } else putchar(ch); } } void entry1(void) { int ch; char A[] = "NOPQRSTUVWXYZABCDEFGHIJKLM"; while ((ch = getchar()) != EOF) { if (isalpha(ch)) putchar(A[toupper(ch)-'A']); else putchar(ch); } } void set_bit(char bit_array[],unsigned bit_number) //bit_number参考char 0到7 { size_t bit_array_len = strlen(bit_array); assert(bit_number < bit_array_len*8);//char 范围是0到255 size_t bit_pos,bit_shift; bit_pos = bit_number / 8; bit_shift = bit_number % 8; bit_array[bit_pos] |= 1 << (7-bit_shift); } void clear_bit(char bit_array[],unsigned bit_number) { size_t bit_array_len = strlen(bit_array); assert(bit_number < bit_array_len*8);//char 范围是0到255 size_t bit_pos,bit_shift; bit_pos = bit_number / 8; bit_shift = bit_number % 8; bit_array[bit_pos] &= ~(1<<(7-bit_shift)); } void assign_bit(char bit_array[],unsigned bit_number,int value) { if (value == 0) clear_bit(bit_array,bit_number); else set_bit(bit_array,bit_number); } int test_bit(char bit_array[],unsigned bit_number) { size_t bit_array_len = strlen(bit_array); assert(bit_number < bit_array_len*8);//char 范围是0到255 size_t bit_pos,bit_shift; bit_pos = bit_number / 8; bit_shift = bit_number % 8; if (bit_array[bit_pos] & (1 <<(7-bit_shift))) return TRUE; else return FALSE; } unsigned int reverse_bits(unsigned int value) { unsigned int length = 0; unsigned int i = ~0; unsigned int answer = 0; for (; i; i >>= 1) length++; for (i = 0;i < length; i++) { answer <<= 1; if (value & 0x01) answer |= 1; value >>= 1; } return answer; } //还不是很明白,到时候自己搞清楚 int store_bit_field(int original_value, int value_to_store,unsigned starting_bits,unsigned end_bits) { unsigned new_value; unsigned length = 8 * sizeof(unsigned int); unsigned pos = starting_bits-end_bits+1; unsigned mask = ~0; mask >>= (length + end_bits - starting_bits - 1); mask <<= end_bits; mask = (~mask) & original_value; value_to_store |= mask; /* 将要复制的东西挖出 */ new_value = mask & value_to_store; /* 复制进去 */ return new_value; } int main(void) { unsigned value =store_bit_field(0xffff,0x123,13,9); return 0; }