c 位运算

来源:互联网 发布:美工废物利用教案 编辑:程序博客网 时间:2024/06/08 01:12

位运算

c:精确控制内存,充分利用cpu

移位指令:

1.算数移位指令
sal eax,1sal ax  ,1sal al   ,1   1000 0001 八位 0x81,左移cf:1  al :0000 0010  0x02

左移sal,最高位放入cf,最低位补0
右移sar,移位放入cf,最高位补符号位
sar al,1 0x81 cf :1 。1100 0000 0xc0

2.逻辑移位指令

shl al,1 左移和算数sal一样
shr al,1 逻辑右移只补0

3.循环移位指令

rol 循环左移,cf:拿出的值,最高位放入最低位
rol al,1 al:0x81 1000 0001
cf:1 al:0000 0011
ror 循环右移
ror al,1 al:0x81 1000 0001
cf:1 al:0xc0 1100 0000

4.带进位的循环移位指令

cf位为整个移位的里面,cf位放入最低位,依次循环,
rcl al,1
cf:0 al:0x81
cf:1 al:0000 0010 0x2
rcr al,1
cf:0 al:0x81
cf:1 al:0100 0000 0x40

c语言位运算

int main(int argc ,char* argv[]){     char x =2;     char y =3;     printf("%d\n",x&y);//2     // 0000 0010     // 0000 0011     //-------------     // 0000 0010     printf("%d\n",x|y);//3     // 0000 0010     // 0000 0011     //-------------     // 0000 0011     printf("%d\n",!x);//这里逻辑取反 0      printf("%d\n",~x);//这里逻辑取反 0xfd     // 0000 0010     //-------------     // 1111 1101     printf("%d\n",x^y);//只有不一样的时候才是1     // 0000 0010     // 0000 0011     //-------------     // 0000 0001 } int main(int argc ,char* argv[]){      char x =8;      //mov dword ptr[ebp-4],8      printf("%d\n",x<<1);      //mov eax,dword ptr[ebp-4]      //shl eax,1      //push eax }  int main(int argc ,char* argv[]){       unsgined char x =8;       //mov dword ptr[ebp-4],8       printf("%d\n",x<<1);       //mov eax,dword ptr[ebp-4]       //shl eax,1       //push eax }   int main(int argc ,char* argv[]){         char x =8;       //mov dword ptr[ebp-4],8         printf("%d\n",x>>1);       //mov eax,dword ptr[ebp-4]       //sar eax,1       //push eax } int main(int argc ,char* argv[]){         unsigned char x =8;       //mov dword ptr[ebp-4],8         printf("%d\n",x>>1);       //mov eax,dword ptr[ebp-4]       //shr eax,1       //push eax }

unsigned char x=0x56;
比如要将第3位置1: x|=0x0008;
要将第3位清0: x&=0xf7;
将最高三位设置成101:x&=0x1f; x|=0xa0;
倒数第n 位
(x >> (n - 1)) & 1

x & (1 << (n - 1)) 判断是否为0

原创粉丝点击