c 位运算

位运算

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值