[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\n",ch,sh);    
    system("pause");
}

//求余数,不用求余运算符
void main(){
    unsigned char ch=73;    //0100 1001 求出73被4整除的余数    
    //首先,将73换为2进制数,然后抹平最后两位(抹平后的数就可以整除4了)
    printf("%d\n",ch-(ch&~3));// ch&~3    抹平最后两位
    system("pause");
}

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

《[c/c++] programming之路(31)、位运算(二)》

三、补码

#include<stdio.h>
#include<stdlib.h>

void main(){
    //printf不会进行类型转换
    printf("%d\n",10.3);//printf不管是什么类型,按照%d,%f解析数据,不同的解析方式有不同的结果
    printf("%f\n",10);
    printf("%d\n",(int)10.3);
    printf("%f\n",(float)10);

    system("pause");
}

《[c/c++] programming之路(31)、位运算(二)》

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

《[c/c++] programming之路(31)、位运算(二)》

《[c/c++] programming之路(31)、位运算(二)》

#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\n",x,x);
    printf("%d,%u\n",y,y);
    system("pause");
}

《[c/c++] programming之路(31)、位运算(二)》

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

《[c/c++] programming之路(31)、位运算(二)》

《[c/c++] programming之路(31)、位运算(二)》

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

1.左移

#include<stdio.h>
#include<stdlib.h>

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

《[c/c++] programming之路(31)、位运算(二)》

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

 2.右移

#include<stdio.h>
#include<stdlib.h>

//右移一位等于÷2
void main(){
    unsigned char ch=128;    //1000 0000                
    printf("%d\n",ch>>1);        
    printf("%d\n",ch>>2);        
    printf("%d\n",ch);
    printf("%d\n",ch=ch>>5);        
    system("pause");
}

《[c/c++] programming之路(31)、位运算(二)》

五、微软试题

《[c/c++] programming之路(31)、位运算(二)》

#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\n",i);        
    system("pause");
} 

返回值为8

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

    《[c/c++] programming之路(31)、位运算(二)》

 

    原文作者:进击的小猴子
    原文地址: https://www.cnblogs.com/little-monkey/p/7758031.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞