本文用来记录学习笔记
位与:& 用来给某一位进行写0操作(与1位与无变化,与0位与变成0) ,特定位清零 。例:0xAA&0xF0 = 0xA0
位或:| 用来给某一位进行写1操作(与0或与无变化,与1位或变成1) ,特定位置1。例:0xAA|0xF0 = 0xFA
位异或:^ 用来给某一位进行取反操作(与0位异或无变化,与1位异或变取反),特定位取反 。例:0xAA^0xF0=0x5A
对寄存器进行操作修改某一位时,应先读取寄存器的值给某一变量。对这一变量进行位操作,然后再将这一变量赋予寄存器。简而言之:读、改、写。这样做的目的是在不改变其它位的值的情况下,只对特定位进行修改。
位取反:~ 有符号数和无符号数有区别
对于无符号数:直接按位取反即可
对于有符号数,按位取反、减1取反(反码转换为原码)
例:
int a = 45;
unsigned int c = 45;
int b,d;
b = ~a;
d = ~c;
printf("bx=%x.\n",b);
printf("b=%d.\n",b);
printf("dx=%x.\n", d);
printf("d=%u.\n", d);
结果:
bx=ffffffd2.
b=-46.
dx=ffffffd2.
d=4294967250.
对于无符号数按位取反比较简单,在这里不进行详细阐述
对于有符号数,以十进制数45为例进行阐述,本系统中int是4字节,即32位:
十进制数45转换为十六进制数为0x0000002d;
按位取反为0xffffff2d(有符号数在计算机中以补码形式保存,故此处为所求结果的补码形式)
将补码形式转换为原码为减1取反为0x8000002e,最后将结果转换为十进制为-46