zoukankan      html  css  js  c++  java
  • 嵌入式C语言之位运算 &..|.~.>>

    在嵌入式编程中,掌握位运算在操作寄存器的时候很方便,由于之前在上位运算的时候没上,但是由于位运算的难度不是很大,自己编写程序,顺便做些总结.

    &   |   ~ 这三个位运算符号不难理解,但是要区别与逻辑运算符号&&  和||

    1.需要总结的是:假如要使寄存器的值为1的话,一般用 这个寄存器的值来| 上1 比如要将i的值变为1则可以使用    i   |=  1;    意思就是将i的值与上1的值再给i。同理要让一个变量的值变成0的话,将使用 &上0     例如   i&=0;

    2.但是一般寄存器都是用16进制来表示,假如要让寄存器的N位为1  只要将 1<<N位  再       |       这个数即可。假如要让寄存器的N位为0 只要将 1<<N位 ,,,取反 再  &  上这个数

     1 #include<stdio.h>
      2 
      3 int main()
      4 {
      5     unsigned i=0x4590ab34; //01000 0101 1001 0000 1010 1011 0011 0100
      6 
      7     int j= 0x37; // 0011 0111  
      8     int k= 0x42; // 0100 0010
      9     unsigned untj=0x37;  //0011 0111
     10 
     11     printf("j&k is %x
    ",j&k);//0000 0010 02
     12     printf("j|k is %x
    ",j|k);//0111 0111 77
     13     printf("~j %x
    ",~j);// 
     14     printf("~untj %x
    ",~untj);// 1100 1000  c8
     15 
     16     unsigned ret=0;
     17     //将i的第4位置1
     18     ret = i|(1 << 3);
     19     printf("i   is %x
    ",i);
     20     printf("ret is %x
    ",ret);
     21 
     22     //将i的第2位置0
     23     ret = i& ~(1 << 2);
     24     printf("i   is %x
    ",i);
     25     printf("ret is %x
    ",ret);
     26 
     27     //将i的第4---9置1
     28     ret = i|(0x3f << 4);//0011 1111 =3f
     29     printf("i   is %x
    ",i);
     30     printf("ret is %x
    ",ret);
     31 
     32     //将i的第4---9置0
     33     ret = i&~(0x3f << 4);//0011 1111 =3f
     34     printf("i   is %x
    ",i);
     35     printf("ret is %x
    ",ret);
     36 
     37     //将i的第4---7置1 且12-- 15置1
     38     ret = i|(0xf << 4 | 0xf << 12) ;// 1111 =f
     39     printf("i   is %x
    ",i);
     40     printf("ret is %x
    ",ret);
     41 
     42     //将i的第4---9置0 且13-- 15置0
     43     ret = i&~(0x3f << 4 | 0x7 << 13) ;// 00111111 3f  0111 =7
     44     printf("i   is %x
    ",i);
     45     printf("ret is %x
    ",ret);
     46 
     47 }
    ~     

    即可。

    下面是测试的代码

  • 相关阅读:
    解决winform DataGridView 绑定数字值列排序不对的问题
    C#中向数据库中添加注册新用户,并查询数据库中是否存在同名的用户。
    SQL数据库的脱机与联机操作
    odoo视频教程收集
    odoo10导入导出-转
    草稿-bom- 肥料生产
    freebsd 域名服务器
    freebsd启动报错:My unqualified host name unkown...Sleeping for retry.
    docker-freebsd-20150625
    supervisorctl error
  • 原文地址:https://www.cnblogs.com/hongzhunzhun/p/4501535.html
Copyright © 2011-2022 走看看