存储程序式计算机以二进制来表示数据和指令。所以,我们可以对二进制位进行一些操作。
这些操作包括了与(&),或(|),异或(^),取反(~),算术左移(<<),逻辑左移(<<),算术右移(>>),逻辑右移(>>)。
与
与运算 | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
可以用与操作来屏蔽某些位。
#include <stdio.h>
int main(void)
{
int a=100;
int b=0xfffffff0;
int c=a&b; //相当于a减去a%16的值
printf("value=%d\n",c);
c=a&0xfffffff0;
printf("value=%d\n",c);
return 0;
}
汇编代码
.section .rodata
.LC0:.string "value=%d\n"
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $12,%esp
movl $100,-4(%ebp);a
movl $0xfffffff0,-8(%ebp);b
movl -4(%ebp),%eax
andl -8(%ebp),%eax
movl %eax,-12(%ebp);c
pushl -12(%ebp)
pushl $.LC0
call printf
addl $8,%esp
movl -4(%ebp),%eax
andl $0xfffffff0,%eax
movl %eax,-12(%ebp)
pushl -12(%ebp)
pushl $.LC0
call printf
addl $8,%esp
movl $0,%eax
leave
ret
movl $100,-4(%ebp) 将a赋值为100,movl $0xfffffff0,-8(%ebp) 将b赋值为0xfffffff0,movl -4(%ebp),%eax 赋值a为%eax,andl -8(%ebp),%eax b与%eax(a)的值相与,并将结果放入%eax中,movl %eax,-12(%ebp) 将与的结果放入c中。
andl $0xfffffff0,%eax 将0xfffffff0与%eax相与,并将结果放入%eax中。
用到的指令有
指令 | 效果 | 描述 |
---|---|---|
AND S,D | D<-D&S | 与 |
或
或运算 | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
可以用于设置某些位。
#include <stdio.h>
int main(void)
{
int a=0xfffffff0;
int b=0xe;
int c=a|b; //相当于a减去a%16的值
printf("value=%d\n",c);
c=a|0xe;