与或左移右移操作在ARM寄存器配置中的作用

时间:2022-05-08 11:36:58
逻辑运算:
与运算&:与0清零  清零用与运算
或运算 |:或1置一  置一用或运算
异或 ^:不同为1
 /*****单个寄存器清零置一********************************************************
int a =0x00000000;
int b = 0xffffffff; //默认是32位寄存器
 
1.让第三位置一  
      a | 0x8 ==> a = a | (0x1<<3)
2.让第三位清零
1111 1111 ... 0111 
b = b & 0xfffffff7 ====>b = b &( ~(0x1<<3))
3.让b的第三位和第五位都清零
1111 1111 1111 1111 .... 1101 0111======(0xffffffd7)16
b = b & 0xffffffd7 ====> (两步):
b = b & (~(0x1<<3))
b = b & (~(0x1<<5))
一步:b = (b & (~(0x1<<3)) ) & (~(0x1<<5))
练习:
1.将a的第三位和第四位置一 1100
a =a | (0x1<<3) a =a | (0x1<<4)
2.将a的第二位和第三位先清零然后置一
a = a & (~(0x1<<2)) a = a & (~(0x1<<3)) ===> a & (~(0x1<<2))& (~(0x1<<3)) ==>
a = a & (~(0x3<<2));
a = a | (0x1<<2) | (0x1<<3); ===> a = a | (0x3<<2)
3.将a的第5,4,3,2这四个位分别设置为 0101
a = a & (~(0x1<<5));
a = a | (0x1<<4);
a = a & (~(0x1<<3));
a = a | (0x1<<2);
 
/******************************************************************************/
 
 
 
/******************************************连续的寄存器置一清零(位域)*********************************************/
位域:操作需要先清零再操作
1.将a的第5,4,3,2这四个位分别设置为 0101
a = a & (~(0xf<<2)) ; //先清零 f指的是连续4位为1 2代表从第二位开始 取反之后又为4个0
a = a | (0x5<<2);      //设置 5指的是0101 2代表从第二位开始
/*******************************************十六进制与二进制对应表**************************************************/
 
1 001
2 010
3 011
4 100
5 0101
6 0110
7 0111
8 1000
9 1001
a 1010
b 1011
c 1100
d 1101
e 1110
f 1111