以下是有关位运算的简单介绍,以及一些适用情况。
C语言包含六种按位运算的运算符,按位运算常用于基础操作包括:
1,按位的与“&”;
2,按位的或“|”;
3,按位取反“~”;
4,按位的异或“^”;
5,左移“<<”;
6,右移“>>”。
一,按位的与“&”
如果x==1并且y==1,则x&y=1,否则x&y=0;
按位与常用于两种应用:
1,让某一位或某些位为0:x & 0xFE;(使一个数的最低位变为0)0xFE=11111110
2,取一个数中的一段:x & 0xFF;(一个数的哪些位上是1,被“&”数对应位上的数保留原数字)
二,按位的或“|”
如果x==1或y==1,则x|y=1,否则x|y==0
按位或常应用于两种应用:
1,使得一位或几个位为1:x | 0x01;(对应位上或“1”)
2,把两个数拼起来:0x00FF | 0xFF00;(变为0xFFFF)
三,按位取反“~”
~x = 1- x;(把1变为0,把0变为1)
想得到全为1的数:~0;
注意取反与取补码的区别“~AA(10101010)==55(01010101)”而AA取补码相当于“(100000000-10101010=10101010)”
如下:
四,逻辑运算于按位运算
计算机中实际没有逻辑运算,只有按位运算,可认为逻辑运算相当于把所有非0值都变成1,然后做按位运算
eg.5&4 —>4 而 5&&4 —>1&1 —>1;
5|4 —>5 而 5||4 —>1||1—>1
~4 —>3而!4 —> !1 —>0
五,按位异或 “^”
如果 x==y , 那么 x^y =0,否则的话为 1;
注意:对同一变量用同一值异或两次,等于什么都没有做。
六,左移
eg. i<<j 相当于将i中所有位向左移动j个位置,而右边填入0
所有小于Int的类型,移位以int的方式来做,结果是int
x << =1 等价于 x*=2 ;
x << = n 等价于 x* =2ⁿ
#include<stdio.h>
int main(void)
{
unsigned char c = 0xA5;
printf (" c=%d\n", c );
printf ("c<<2=%d\n", c<<2);
}
结果为:c=165;c<<2=660;恰为四倍
七,右移
与左移类似,向右移动对应位数,有几处不同
1,x >> 1 等价于 x/=2;
x >> n 等价于 x/=2ⁿ;
2,对于unsigned的类型 , 左边填入0;
对于signed的类型 , 左边填入原来的最高位(保持符号不变)
注意!!!!
x << -2 // 此种写法毫无意义
八,补充:关于用位运算输出一个数的二进制
#include<stdio.h>
int main (void)
{
int number;
scanf ("%d" , &number );
unsigned mask = 1u << 31;//1u及1
//printf ("%hhx\n",1u);
for ( ; mask ; mask>>=1){
printf ("%d", number & mask?1:0);
}
printf ("\n");
return 0;
}
巧妙同过位运算将数字转化为二进制形式。