1.定义:位运算通常是指对二进制数的运算。常见的位运算符有
(1)& 按位与 全一则一
(2)| 按位或 有一则一
(3)^按位异或 相同位上不一样则为1
(4) ~取反,将0变成1,将1变成0.
(3)<< 左移 M<<1是将M转化成2进制数,向左移动一位 丢弃高位,低位补零。
左移就相当于乘以2的n次方。
eg: 将十进制3左移4位,则有: 3<<4就等于将0000 0011左移4位。即0011 0000
(4)>> 右 移 M<<1是将M转化成2进制数 向右移动一位.
右移就相当于除以2的n次方。 丢弃低位,高位补符号位。
对于有符号数时,在右移时,符号位将跟随移动。当为正数时,最高位补0;当为负数时,符号位补1.
eg: 将15右移两位,即0000 1111>>2,则有 0000 0011
2.按位运算规则
(1) 将第K位变1:
按位或 1。因为0和任何数字按位或都不变,1和任何数字按位或都为1.
eg:
(2)将第k位变成0:
按位与0。因为0和任何数字按位与都变0,1和任何数字按位与都不变
eg:
(3)将第k位取反:
按位异或 .因为0和任何数字按位异或都不变,1和任何数字按位异或都取反
总规则: 1.确定符号 2.确定数字 3.构造数字
3.有关位运算的算法(一字节)
1.将ch的 二进制右数第n位置 1(n从1开始)
int GetBits( char *ch,int n)//0101 0010->0101 0110
{
if(n<1||n>8)
{
return false;
}
*ch|=1<<(n-1);
return ture;
}
2.获取ch的 二进制右数第n位置 的值(n从1开始)
int GetBits( char ch,int n)
{
if(n<1||n>8)
{
return false;
}
return (ch>>(n-1))&1);
}
3.将ch的 二进制右数第n位清 0(n从1开始)
int GetBits( char *ch,int n)
{
if(n<1||n>8)
{
return false;
}
*ch&=~(1<<(n-1));
}
4.位反转 (按位取反)
unsigned int GetBits(unsigned int n)
{
unsigned int tmp=0;
for(int i=0;i<32;i++)
{
if(((n>>i)&1)!=0)
{
tmp|=1<<(31-i);
}
}
return tmp;
}