C操作符详解<<左移,>>右移,&按位与,|按位或,^异或

注:以下操作符的操作数只能是整数

在讲操作符之前我们先了解一下整数是用3种二进制的表示形式的

分别是源码在使用或打印整数时用源码),

           反码

           补码整数在内存中存放的就是补码

例如

正整数5,(正整数源码反码补码相同

10进制5用2进制表达是0101,因为整数int类型占内存4个字节—32个比特,所以有32个二进制数 

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第1张图片

负整数 -5

负数源码的最高位为1,其余与正整数相同,

        反码:除最高位(右边)外其余相反

        补码:反码+1就是补码

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第2张图片

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第3张图片

理解完这些我们就可以学习<< 左移和 >> 右移操作符了

<< 左移(移动内存中存储的补码

补码中左边抛弃删掉、右边补0

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第4张图片

因为要printf("%d",b);  所以在补码向左边移动完两位,右边补0后就要把补码转换为源码打印出来

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第5张图片

>>右移(移动内存中存储的二进制位,补码

右移分两种:

1.逻辑右移

左边用填充0,右边丢弃

2.算术右移

补码左边最高位用原来的符号位填充,右边丢弃            可以看出这里用的是算术右移

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第6张图片

 位操作符

&     按位与操作符,也是操作存储在内存的二进制数(补码)

补码按位&与时:有0为0,全1为1

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第7张图片

 |  按位或操作符

有1为1,全0为0

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第8张图片

    异或操作符:相同为0,不同为1

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第9张图片

取反操作符~(将补码完全取反

int main()
{
	int a = -1;
	//10000000000000000000000000000001 - 原码
	//11111111111111111111111111111110 - 反码
	//11111111111111111111111111111111 - 补码
	//~ 按位取反
	//11111111111111111111111111111111
	//00000000000000000000000000000000
	//
	int b = ~a;
	printf("%d\n", a);
	printf("%d\n", b);

	return 0;
}

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第10张图片



这里有几道题帮助我们更好的理解这些操作符的作

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第11张图片

 因为c=1,所以一个数按位与(&)1的时候,二进制数的最后一位为1的时候按位与都为1

然后a=a>>1;

       b=b>>1;     

 这里作用是当二进制位的最右边的一位判断完后再将最右边的一位抛弃,然后再看二进制中新的最右边的一位

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第12张图片


统计二进制中1的个数

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第13张图片

                        交换两个变量(不创建临时变量)

C操作符详解<<左移,>>右移,&按位与,|按位或,^异或_第14张图片

你可能感兴趣的:(c语言,开发语言,后端)