zoukankan      html  css  js  c++  java
  • 嵌入式培训学习历程第十三天

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

                  位操作

      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
  • 相关阅读:
    easyui datagrid 跨页选择
    (转)flexpaper 参数
    FlexPaper做的类似百度文库的效果
    (转)ashx 使用Session
    (转)C#_WinForm接收命令行参数
    从数据库取出文件流显示图片
    (转)oracle触发器使用:after insert 与before insert的简单使用注意
    (转)sql server 事务与try catch
    (转)sqlite developer注册方法
    (转)IDataGridViewEditingControl 接口 作用
  • 原文地址:https://www.cnblogs.com/cxw825873709/p/3231425.html
Copyright © 2011-2022 走看看