昨天的东西,今天休息一天,把布置的题做完了。。补上。。
位操作
1. 应用 : 进位标志,溢出标志,零值标志
2.位操作运算符 :
(1). 按位与 &
特点 :任何值与0进行&,结论均为0
任何值与1进行&,结论为原值
应用 : 对某位清零
(2). 按位或 |
特点:任何值与1进行|,结论均为1
任何值与0进行|,结论为原值
应用:对某位置一
(3). 按位非~ : 不区分符号位
(4). 按位异或^ : 同为0,异为1
特点 : 任何值与0进行^,保持原值
任何值与1进行^,将原值取反
特性 :
数据的清零
实现某些整数位的反转
奇偶效验
变量交换 例 : 实现a和b的值得交换,在不使用第三方变量的情况下 a = a^b, b = b^a, a= a^b;
3.位运算符 :
左移 << 左移相当于乘以2
右移 >> 右移相当于除以2
4.位图 使用位来存储数据
好处 : 节省存储空间
通常 :位操作数为无符号整数
补上,今天的英语 :unfortunately(遗憾的) generate(生成) identification(鉴定)
习题:
1. 判断某个数是奇数还是偶数
1 //c1.c 2 #include <stdio.h> 3 4 void input_2(unsigned int); 5 6 int main(int argc , char *argv[]) 7 { 8 //int num; 9 #if 0 10 printf("Enter a number : "); 11 scanf("%d", &num); 12 13 input_2(num); 14 num = num & ~0x3E | 0x2A; 15 printf("After----------------------\n"); 16 printf("%d\n", num); 17 input_2(num); 18 printf("\n"); 19 #endif 20 unsigned int num; 21 22 printf("Enter a number : "); 23 scanf("%u", &num); 24 25 input_2(num); 26 //num = num & 0xfffffff8; // 0-3位清零 27 //num = num | 0x78;//4-7位置一 28 //num = num ^ 0x7; //0-3位取反 29 if(0 == (num = num & 0x1)) { 30 printf("%u\n", num); 31 printf("oshuo"); 32 } 33 else { 34 printf("%u\n", num); 35 printf("jishuo"); 36 } 37 printf("\n"); 38 input_2(num); 39 40 return 0; 41 } 42 43 void input_2(unsigned int input_num) 44 { 45 int i; 46 for(i = 31; i >= 0; i --) 47 { 48 if((input_num) & (1 << i)) { 49 printf("1"); 50 } 51 else { 52 printf("0"); 53 } 54 } 55 printf("\n"); 56 57 return ; 58 }
2.通过位运算将整型数据的某些位清零 使用函数封装cleanbits(unsigned int n, int start, int end)
1 //clean_0.c 2 #include <stdio.h> 3 #include <math.h> 4 5 void input_2(unsigned int); 6 unsigned int cleanbits(unsigned int, int, int); 7 int cifang(int , int); 8 9 int main(int argc, char *argv[]) 10 { 11 unsigned int num = 0, after_num = 0; 12 int start = 0, end = 0; 13 14 printf("Enter a number : "); 15 scanf("%u", &num); 16 printf("Enter you want start end : "); 17 scanf("%d %d", &start, &end); 18 19 input_2(num); 20 after_num = cleanbits(num, start, end); 21 input_2(after_num); 22 23 return 0; 24 } 25 26 unsigned int cleanbits(unsigned int clean_num, int clean_start, int clean_end) 27 { 28 return (clean_num & (~((cifang(2, (clean_end - clean_start + 1)) - 1) << clean_start))); 29 } 30 31 int cifang(int ci_num, int ci_how) 32 { 33 int i; 34 if(1 == ci_how) { 35 return 2; 36 } 37 for(i = 1;i != ci_how; i ++) 38 { 39 ci_num *= 2; 40 } 41 return ci_num; 42 }
1 //input_2.c 2 #include <stdio.h> 3 4 void input_2(unsigned int input_num) 5 { 6 int i; 7 for(i = 31; i >= 0; i --) 8 { 9 printf("%d", (input_num >> i) & 1); 10 } 11 printf("\n"); 12 13 return ; 14 }
必须将clean_0.c 和 input_2.c 同时编译
3.通过位运算将整型数据的某些位置1 使用 函数 封装setbits(unsigned int n, int start, int end)
1 //set_1.c 2 #include <stdio.h> 3 4 void input_2(unsigned int); 5 unsigned int setbits(unsigned int, int, int); 6 int power(int , int); 7 8 int main(int argc, char *argv[]) 9 { 10 unsigned int num, after_num; 11 int start = 0, end = 0; 12 printf("Enter a number : "); 13 scanf("%u", &num); 14 printf("Enter you want start and end : "); 15 scanf("%d %d", &start, &end); 16 17 input_2(num); 18 after_num = setbits(num , start, end); 19 input_2(after_num); 20 21 return 0; 22 } 23 24 unsigned int setbits(unsigned int set_num, int set_start, int set_end) 25 { 26 return set_num | ((power(2, (set_end - set_start + 1)) - 1) << set_start); 27 }
1 //input_2.c 2 #include <stdio.h> 3 4 void input_2(unsigned int input_num) 5 { 6 int i; 7 for(i = 31; i >= 0; i --) 8 { 9 printf("%d", (input_num >> i) & 1); 10 } 11 printf("\n"); 12 13 return ; 14 }
1 //power.c 2 int power(int p_num, int p_end) 3 { 4 int i; 5 if(1 == p_end) { 6 return p_num; 7 } 8 for(i = 1; i != p_end; i ++) 9 { 10 p_num *= 2; 11 } 12 return p_num; 13 }
必须将set_1.c ,input_2.c 和 power.c 同时编译
4.通过位运算获取某个整形数据的某些位 使用函数封装getbits(unsigned int n, int start, int end)
1 //get.c 2 #include <stdio.h> 3 4 void input_2(unsigned int); 5 int power(int , int); 6 unsigned int getbits(unsigned int, int, int); 7 8 int main(int argc, char *argv[]) 9 { 10 unsigned int num, after_num; 11 int start = 0, end = 0; 12 13 printf("Enter a number : "); 14 scanf("%d", &num); 15 printf("Enter you want start and end : "); 16 scanf("%d %d", &start, &end); 17 18 input_2(num); 19 after_num = getbits(num, start, end); 20 input_2(after_num); 21 22 return 0; 23 } 24 25 unsigned int getbits(unsigned int get_num, int get_start, int get_end) 26 { 27 return get_num & (((power(2, (get_end - get_start + 1)) - 1)) << get_start); 28 }
1 //input_2.c 2 #include <stdio.h> 3 4 void input_2(unsigned int input_num) 5 { 6 int i; 7 for(i = 31; i >= 0; i --) 8 { 9 printf("%d", (input_num >> i) & 1); 10 } 11 printf("\n"); 12 13 return ; 14 }
1 //power.c 2 int power(int p_num, int p_end) 3 { 4 int i; 5 if(1 == p_end) { 6 return p_num; 7 } 8 for(i = 1; i != p_end; i ++) 9 { 10 p_num *= 2; 11 } 12 return p_num; 13 }
必须将get.c ,input_2.c 和 power.c 同时编译
5.若有unsigned short a = 0x1234,b = 0x5678,获取a的高字节,b的低字节组合成新值,结果为:0x1278
1 //high_low.c 2 #include <stdio.h> 3 4 int power(int, int); 5 unsigned short get_number(unsigned short, int, int); 6 unsigned short high_low(unsigned short, unsigned short); 7 8 int main(int argc, char *argv[]) 9 { 10 unsigned short a = 0x1234, b = 0x5678; 11 unsigned short after_a, after_b, after_end; 12 int start = 0, end = 0; 13 printf("a = %#x b = %#x\n", a, b); 14 15 after_a = get_number(0x1234, 8, 15); 16 after_b = get_number(0x5678, 0 , 7); 17 after_end = high_low(after_a, after_b); 18 19 printf("After High_Low --------------------------\n"); 20 printf("End = %#x\n", after_end); 21 22 return 0; 23 } 24 25 unsigned short high_low(unsigned short high_a, unsigned short low_b) 26 { 27 return high_a | low_b; 28 } 29 30 unsigned short get_number(unsigned short get_a, int get_start, int get_end) 31 { 32 return get_a & ((power(2, (get_end - get_start + 1)) - 1) << get_start); 33 }
1 //power.c 2 int power(int p_num, int p_end) 3 { 4 int i; 5 if(1 == p_end) { 6 return p_num; 7 } 8 for(i = 1; i != p_end; i ++) 9 { 10 p_num *= 2; 11 } 12 return p_num; 13 }
必须将high_low.c 和 power.c 同时编译
6.实现unsigned short数据的字节交换
1 //change.c 2 #include <stdio.h> 3 4 unsigned short change_byte(unsigned short); 5 6 int main(int argc, char *argv[]) 7 { 8 unsigned short num, after_num; 9 10 printf("Enter a number : "); 11 scanf("%hu", &num); 12 13 printf("%#x\n", num); 14 //num = 0x1234; 15 after_num = change_byte(num); 16 printf("After change------------------------------------\n"); 17 18 printf("%#x\n", after_num); 19 20 return 0; 21 } 22 23 unsigned short change_byte(unsigned short change_num) 24 { 25 unsigned short change_num_07, change_num_815; 26 change_num_07 = change_num; 27 change_num_815 = change_num; 28 change_num_07 = change_num_07 & 0xff; 29 change_num_815 = change_num_815 & (~0xff); 30 return (change_num_07 << 8) | (change_num_815 >> 8); 31 }
7.求unsigned int型数据中有多少个1
1 //num_1.c 2 #include <stdio.h> 3 4 int num_1(unsigned int); 5 6 int main(int argc, char *argv[]) 7 { 8 unsigned int num; 9 10 printf("Enter a number : "); 11 scanf("%u", &num); 12 13 printf("The %u have %d number_1.\n", num, num_1(num)); 14 15 return 0; 16 } 17 18 int num_1(unsigned int num_1_num) 19 { 20 int i, sum = 0; 21 for(i = 31; i >= 0; -- i) 22 { 23 if(num_1_num & (1 << i)) { 24 ++ sum; 25 } 26 } 27 28 return sum; 29 }
8.实现unsigned int型数据的二进制打印
1 //input2_2.c 2 #include <stdio.h> 3 4 void input2_2(unsigned int); 5 6 int main(int argc, char *argv[]) 7 { 8 unsigned int num; 9 printf("Enter a number : "); 10 scanf("%u", &num); 11 12 printf("The input2_2--------------------------------\n"); 13 input2_2(num); 14 15 return 0; 16 } 17 18 void input2_2(unsigned int input2_num) 19 { 20 int i; 21 for(i = 31; i >= 0; i --) 22 { 23 printf("%d", (input2_num >> i) & 1); 24 } 25 printf("\n"); 26 27 return ; 28 }
9.通过位操作实现字母的大小写转化
1 //A_a.c 2 #include <stdio.h> 3 4 int main(int argc, char *argv[]) 5 { 6 char c; 7 printf("Enter a character : "); 8 9 while((c = getchar()) != '\n') 10 { 11 c = c ^ 0x20; 12 printf("%c", c); 13 } 14 printf("\n"); 15 16 return 0; 17 }
10.使用位操作实现整数乘法
1 //chengfa.c 2 #include <stdio.h> 3 4 void sum_2(int, int []); 5 6 int main(int argc, char *argv[]) 7 { 8 int num_1, num_2, itemp; 9 int sum = 0; 10 int i; 11 int wei_num[1024] = {0}; 12 13 printf("Enter two numbers num_1 num_2 to add : "); 14 scanf("%d %d", &num_1, &num_2); 15 16 sum_2(num_2, wei_num); 17 18 for(i = 0; wei_num[i] != 37; i ++) 19 { 20 printf("%d\n", wei_num[i]); 21 sum += (num_1 << wei_num[i]); 22 } 23 24 printf("Weiyunsuan End !\n"); 25 printf("The %d + %d = %d.\n", num_1, num_2, sum); 26 27 return 0; 28 } 29 30 void sum_2(int sum_num, int sum_wei_num[1024]) 31 { 32 int count = 0; 33 int i, j = 0; 34 35 for(i = 0; i != 31; i ++) 36 { 37 if(1 == (sum_num >> i & 1)) { 38 sum_wei_num[j] = count; 39 ++ j; 40 } 41 ++ count; 42 } 43 sum_wei_num[j] = 37; 44 45 return ; 46 }
11.位操作实现循环左移、右移
1 //left_rifht.c 2 #include <stdio.h> 3 #include <unistd.h> 4 5 enum hex{left, right}; 6 7 void input_2(unsigned int); 8 unsigned int left_1(unsigned int); 9 unsigned int right_1(unsigned int); 10 11 int main(int argc, char *argv[]) 12 { 13 unsigned int num, after_num; 14 int choose_num; 15 16 17 printf("Enter a number and enter (0 1) to choose (left rignt) : "); 18 scanf("%u %d", &num, &choose_num); 19 20 input_2(num); 21 for(; ;) 22 { 23 switch(choose_num) 24 { 25 case left : 26 after_num = left_1(num); 27 input_2(after_num); 28 printf("\n"); 29 sleep(1); 30 num = after_num; 31 break; 32 case right : 33 after_num = right_1(num); 34 input_2(after_num); 35 printf("\n"); 36 sleep(1); 37 num = after_num; 38 break; 39 } 40 } 41 42 return 0; 43 } 44 45 unsigned int right_1(unsigned int right_num) 46 { 47 unsigned int itemp; 48 itemp = right_num & 1; 49 printf("%d\n", itemp); 50 if(0 == itemp) { 51 return right_num >> 1; 52 } 53 else { 54 return right_num >> 1 | 1 << 31; 55 } 56 } 57 58 unsigned int left_1(unsigned int left_num) 59 { 60 unsigned int itemp; 61 62 itemp = (left_num >> 31) & 1; 63 printf("%u\n", itemp); 64 if(0 == itemp) { 65 return left_num << 1; 66 } 67 else { 68 return left_num << 1 | itemp; 69 } 70 return (left_num << 1) & itemp; 71 }
12.使用位操作的知识向数组中保存26个没有重复的英文字母
1 //find_A_Z.c 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <time.h> 6 7 void output_char(char []); 8 void input_2(unsigned int); 9 10 int main(int argc, char *argv[]) 11 { 12 char str[1024]; 13 int i, itemp = 0, check_num = 0, get_rand; 14 15 srand(time(NULL)); 16 17 for(i = 0; i != 26; i ++) 18 { 19 itemp = i; 20 get_rand = rand() % 26; 21 if(1 == ((check_num >> get_rand) & 1)) { 22 i = itemp - 1; 23 continue ; 24 } 25 str[i] = 'A' + get_rand; 26 input_2(check_num); 27 printf("\n"); 28 check_num |= 1 << get_rand; 29 } 30 31 printf("input success -------------------\n"); 32 output_char(str); 33 34 return 0; 35 } 36 37 void output_char(char output_str[1024]) 38 { 39 int i; 40 41 for(i = 0; i != strlen(output_str); i ++) 42 { 43 printf("%c ", output_str[i]); 44 } 45 printf("\n"); 46 47 return ; 48 }