位运算
c:精确控制内存,充分利用cpu
移位指令:
1.算数移位指令
sal eax,1
sal ax ,1
sal 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