zoukankan      html  css  js  c++  java
  • [c/c++] programming之路(31)、位运算(二)

    一、取反的高级用法

    #include<stdio.h>
    #include<stdlib.h>
    
    //取反的作用:末位清零        取反适用于各种位数不同的数据
    void main0(){
        unsigned char ch=73;        //0100 1001
        unsigned short sh=16385;    //0100 0000 0000 0001    
        ch=ch&~1;//抹平最后一位
        sh=sh&~1;
        printf("%d,%d
    ",ch,sh);    
        system("pause");
    }
    
    //求余数,不用求余运算符
    void main(){
        unsigned char ch=73;    //0100 1001 求出73被4整除的余数    
        //首先,将73换为2进制数,然后抹平最后两位(抹平后的数就可以整除4了)
        printf("%d
    ",ch-(ch&~3));// ch&~3    抹平最后两位
        system("pause");
    }

    二、内存(高位在高字节,低位在低字节)

    三、补码

    #include<stdio.h>
    #include<stdlib.h>
    
    void main(){
        //printf不会进行类型转换
        printf("%d
    ",10.3);//printf不管是什么类型,按照%d,%f解析数据,不同的解析方式有不同的结果
        printf("%f
    ",10);
        printf("%d
    ",(int)10.3);
        printf("%f
    ",(float)10);
    
        system("pause");
    }

    char ch=1,ch1='1';//字符与编号的区别
    printf("%d,%d
    ",ch,ch1);
    system("pause");

    #include<stdio.h>
    #include<stdlib.h>
    
    void main(){
        int x=4294967295;
        int y=-1;
        //1111 1111 1111 1111 1111 1111 1111 1111    在内存中的存储方式
        //无符号,没有符号位,全都是数据    4294967295
    
        //0000 0000 0000 0000 0000 0000 0000 0001    1原码
        //1000 0000 0000 0000 0000 0000 0000 0001    -1原码
        //1111 1111 1111 1111 1111 1111 1111 1110    -1反码
        //1111 1111 1111 1111 1111 1111 1111 1111    -1补码
    
        printf("%d,%u
    ",x,x);
        printf("%d,%u
    ",y,y);
        system("pause");
    }

    unsigned int num=-1;
    //1111 1111 1111 1111 1111 1111 1111 1111    内存的存储方式
    printf("%d,%u
    ",num,num);

    四、移位(CPU寄存器中进行计算)

    1.左移

    #include<stdio.h>
    #include<stdlib.h>
    
    //左移一位等于*2
    void main(){
        unsigned char ch=1;      //0000 0001        1
        printf("%d
    ",ch<<1);    //0000 0010        2
        printf("%d
    ",ch<<2);    //0000 0100        4    // ch<<2 CPU寄存器计算
        printf("%d
    ",ch);       //移位不改变原值
        printf("%d
    ",ch=(ch<<2));//通过赋值号改变原值
        system("pause");
    }

    //左移要注意溢出,考虑数据的极限
    void main0(){
        unsigned char ch=1;        //0000 0001        1        
        //ch=ch<<7;                //1000 0000        128
        ch=ch<<8;                //10000 0000    溢出,为0
        printf("%d
    ",ch);        //溢出后的数据无法读取
        system("pause");
    }

     2.右移

    #include<stdio.h>
    #include<stdlib.h>
    
    //右移一位等于÷2
    void main(){
        unsigned char ch=128;    //1000 0000                
        printf("%d
    ",ch>>1);        
        printf("%d
    ",ch>>2);        
        printf("%d
    ",ch);
        printf("%d
    ",ch=ch>>5);        
        system("pause");
    }

    五、微软试题

    #include<stdio.h>
    #include<stdlib.h>
    
    void main(){
        int x=9999;        //10 0111 0000 1111
        int i=0;
        while (x)
        {
            i++;
            x=x&(x-1);//每次操作清零一个“1”,用于统计二进制整数有多少个1
        }
        printf("%d
    ",i);        
        system("pause");
    } 

    返回值为8

    补充:9999如何转为2进制数

        

  • 相关阅读:
    linux 串口调试总结
    linux 环境变量的设置方法
    linux 内核的配置和编译
    linux 串口应用程序的编写指南
    linuxdifff 和 patch 的使用指南
    linux shell 的学习随笔
    特性阻抗和频率有关吗?
    linux source和export命令的使用
    关于SI设计与SI仿真的一点浅见
    LINUX下的tty,console与串口分析
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7758031.html
Copyright © 2011-2022 走看看