C语言学习笔记 位运算

位运算: 

一、左移 、右移

A<<1 相当于 A*2;同理  A<

比如  int A =B*1024  相当于左移10位,编译器能够自动编译。

下面考虑有符号数的移位,首先了解一下 负数在内存空间的存储方式。以8bit 的-1为例。

    -1     二进制原码    1 0 0 0     0 0 0 1 -21000 0010

     二进制反码     1 1 1 1    1  1 1 01111 1101

     二进制补码     1  1 1 1   1  1  1 11111 1110 

(1)在计算机中 “-1”的存储成   “1111 1111 ”,在实际应用中经常赋值-1,来赋值全高电平

(2)无论正负,均可以完成“*2”

(3)同理可以推出 右移的相关特性。但是有一点值得注意,要注意符号位,最高位的填充是按照原数据符号进行填充的。

比如  负数  则填写 1;无符号的数则不用考虑。

 
  
#include 
int main ()
{
int a,b ;
a=1;
b=-1;
while (a){
		a=a>>1;
	}
printf("++++++++++++++\r\n");
while (b){
	b=b>>1;
	}
printf("-------------\r\n");
}

在执行程序后就会发现, 第二个while函数在一直循环下去,进入了死循环。

二、位与、位非、位或

与数字电路的逻辑处理是一样的,存在着一些技巧的运用。

比如: int a = 0x 1234   ;         a=a& 0xff00;  作用就是将低八位赋0、或者称之为屏蔽。

同理能够理解 或 取出相对应位置的数值。

&:也叫清零器(CLEAR),|:置位(设置器SET)

三、异或^

1、主要用途是异或加密算法

2、用于不引入第三方数据进行数据交换,通过三册异或就可以实现数据的交换,在一些特殊的情况中可以使用

#include 
 
int main ()
{
int a=20;
int b=30;
a= a^b;
b=a^b;
a=a^b;
printf("a=%d \r\n b=%d",a,b);
return 0;
}

通过以上程序就能实现a、b的互换了。

四、取反~

诸位取反。



你可能感兴趣的:(C语言)