嵌入式培训学习历程第十三天

  昨天的东西,今天休息一天,把布置的题做完了。。补上。。

              位操作

  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----------------------
");
16     printf("%d
", num);
17     input_2(num);
18     printf("
");
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
", num);
31         printf("oshuo");
32     }
33     else {
34         printf("%u
", num);
35         printf("jishuo");
36     }
37     printf("
");
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("
");
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 }
clean_0.c 
  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("
");
 12 
 13     return ;
 14 }
input_2.c

 

 必须将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 }
set_1.c
 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("
");
 12 
 13     return ;
 14 }
input_2.c
  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 }
power.c

  必须将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 }
get.c
 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("
");
 12 
 13     return ;
 14 }
input_2.c
 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 }
power.c

  必须将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
", 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 --------------------------
");
20     printf("End = %#x
", 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 }
high_low.c
 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 }
power.c

  必须将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
", num);
14     //num = 0x1234;
15     after_num = change_byte(num);
16     printf("After change------------------------------------
");
17 
18     printf("%#x
", 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 }
change.c

  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.
", 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 }
num_1.c

  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--------------------------------
");
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("
");
26 
27     return ;
28 }
input2_2.c

  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()) != '
')
 10     {   
 11         c = c ^ 0x20;
 12         printf("%c", c);
 13     }
 14     printf("
");
 15     
 16     return 0;
 17 }
A_a.c

  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
", wei_num[i]);
21         sum += (num_1 << wei_num[i]);
22     }
23     
24     printf("Weiyunsuan End !
");
25     printf("The %d + %d = %d.
", 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 }
chengfa.c

  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("
");
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("
");
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
", 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
", 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 }
left_right.c

  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("
");
28        check_num |= 1 << get_rand;
29     }
30     
31     printf("input success -------------------
");
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("
");
46 
47     return ;
48 }
find_A_Z.c
原文地址:https://www.cnblogs.com/cxw825873709/p/3231425.html