一:按位与
特点:跟0与则得0,跟1与则保留原位。
应用:保留某些位(保留为取1),其余位清0(清0位取0)。实现此功能时,经常会用到16进制的f和0,因为16进制中的1位即可表示二进制中的4位,而16进制中的f等效于二进制中的1111,十六进制中的0等效于二进制中的0000。
举例:某数的二进制表示为 0000 0000 1000 0100 0000 0000 0010 0101
现在与十六进制的0xffffff00与 1111 1111 1111 1111 1111 1111 0000 0000
结果为 0000 0000 1000 0100 0000 0000 0000 0000
实现了低八位取0,高二十四位保留。
当要求的位数较具体时(不是类似于低八位,高八位这样的要求时),就不能使用16进制了。总之,记住特点就好办了。
二:按位非
特点:跟0非则保留原位,跟1非则得1。
应用:保留某些位,其余位取1。
三:按位异或
特点:跟1异或使原位取反,跟0异或保留。
应用:(1)使某些位取反,并保留其他位。
(2)若a^b=c,则c^b=a且c^a=b,利用此特点可以不借助中间变量而实现两个数交换。
四:按位取反
特点:原来的0变为1,原来的1变为0。
五:左移
特点:原有的高位舍弃,空出的低位补0。左移一位,就相当于乘2。但应注意的是,左移并不改变原来的数;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//程序目的:验证左移并不改变原来的数,且满足左移n位,乘2^n
//
//编程环境:vc6.0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
void main()
{
int a=9;
int b=a<<1;
printf("%d %d",a,b);
}
左移操作比乘法操作快得多,所以当需要乘2的倍数时,可以考虑用左移。
六:右移
特点:原有低位舍弃,空出的高位用符号位填补(vc++下)。同样的,右移n位,则原来的数除以2^n,除不尽时往小里取。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//程序目的:验证右移n位,在原来的基础上除以2^n,并且在除不尽时,往小里取
//
//编程环境:vc6.0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
void main()
{
int a=9;
int b=a>>1;
printf("%d %d",a,b);
}