[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"); }
二、内存(高位在高字节,低位在低字节)
三、补码
#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"); }
char ch=1,ch1='1';//字符与编号的区别 printf("%d,%d\n",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\n",x,x); printf("%d,%u\n",y,y); system("pause"); }
unsigned int num=-1; //1111 1111 1111 1111 1111 1111 1111 1111 内存的存储方式 printf("%d,%u\n",num,num);
四、移位(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"); }
//左移要注意溢出,考虑数据的极限 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"); }
五、微软试题
#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进制数