关于位运算

    以下是有关位运算的简单介绍,以及一些适用情况。

    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;
}

巧妙同过位运算将数字转化为二进制形式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值