C语言 –位运算

C语言 –位运算总结一下,自己脑子短路时可以查看一下。一,位运算符:逻辑运算符:&:位‘与’;^:位‘异或’|:位‘或’~:位‘非’,取反移位运算符:<<:左移>>:右移逻辑位运算都是以(bit)为单位。二:‘~’非,取反位取反的操作符为“~”,0变成1,1变成0,需要注意的是,位取反运算并不会改变操作数…

大家好,欢迎来到IT知识分享网。

总结一下,自己脑子短路时可以查看一下。

一,位运算符:

逻辑运算符:

  1. &:位 ‘与’ ;
  2. ^: 位 ‘异或’
  3. |: 位 ‘或’
  4. ~: 位 ‘非’,取反

移位运算符:

  1. <<: 左移
  2. >>: 右移

逻辑位运算都是以 (bit)为单位。

二: ‘~’ 非 ,取反

位取反的操作符为“~”,0变成1,1变成0,需要注意的是,位取反运算并不会改变操作数的值,它只是再内存中进行的。如果想要改变需要重新赋值。

#include<stdio.h>
#include<stdlib.h>

void main()
{
	unsigned char ch = 15; //0000 1111
	unsigned char ch1 = ~ch; //1111 0000
	unsigned char ch2 = ~ch1;//0000 1111

	printf("%d,%d,%d", ch, ch1, ch2);
	

	system("pause");
}

输出:
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

/*

取反操作,
不管是 8 位 16位 清除最后一位(末尾清零)

  & ~1  通用

*/

void main(void)
{
	unsigned char ch = 15; // 1111 1111
	unsigned short sh = 16385; //0100 0000 0000 0001
	ch = ch & ~1;
	sh = sh & ~1;
	printf("%d, %d  \n", ch, sh);
	unsigned char ch1 = 1; // 0000 0001 --> 1111 1110
	unsigned char ch2 = ~(~ch1);
	printf("%d  , %d\n", ~ch1,ch2);

	system("pause");
}

输出:
在这里插入图片描述

三:位 与 运算 &:

位与运算的操作符为&,1 & 1=1 1 & 0=0 0 & 1=0 0 & 0=0

#include<stdio.h>
#include<stdlib.h>

void main()
{
	//与运算 : 1 & 1 =1 ; 1 & 0 = 0 ; 0 & 1 = 0 ;0 & 0 = 0 (相同成立,不同不成立)

	unsigned char ch1 = 3;		// 0000 0011
	unsigned char ch2 = 240;	// 1111 0000
	unsigned char ch3 = 255;	// 1111 1111




	printf("%d", ch1 & ch2);
	printf("\n%d", ch1 & ch3);

	printf("\n");
	system("pause");
}

输出:
在这里插入图片描述
与0相与都是0 ,可以实现按位清零

//实现安位清零 二进制位与0相与执行清零动作
void main()
{

	unsigned char ch = 255;  //1111 1111
	unsigned char ch1 = 15;  //0000 1111
	unsigned char ch2 = 240; //1111 0000

	//清零高4位
	printf("%d", ch & ch1);
	//清零低4位
	printf("\n%d\n", ch & ch2);


	system("pause");
}

在C#中 & 操作默认返回 int 类型。要取分有符号和无符号 int 类型。
无符号为:uint 类型 数据范围

  1. 0 – 4294967295
  2. 最大16进制标识为:0xFFFF FFFF
  3. 二进制:1111 1111 1111 1111 1111 1111 1111 1111

有符号为:int 类型 数据范围

  1. -2147483648 – 2147483647
  2. 最大16进制标识为 0x7FFF FFFF
  3. 二进制:0111 1111 1111 1111 1111 1111 1111 1111 (最前面为符号位 0正数,1负数)

在这里插入图片描述
与1相与 值不变 获取指定位:

//获取指定位 二进制位与1相与保持某些位不变。
void main()
{

	unsigned char ch = 169; // 1010 1001
	//获取中间四位
	unsigned char ch1 = 60; // 0011 1100

	/*
		1010 1001
	&	0011 1100 
		0010 1000
	*/
	printf("%d", ch & ch1);

	//获取前5位
	unsigned char ch2 = 248; //1111 1000
	/*
		1010 1001
	&	1111 1000
	------------------
		1010 1000

	*/
	printf("\n%d\n", ch & ch2);
	

	system("pause");



}

在这里插入图片描述

四:位 或 | 运算

位或运算的操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下:
1 | 1=1 1 | 0=1 0 | 1=1 0 | 0=0

#include<stdio.h>
#include<stdlib.h>

void main()
{
	//或运算:1|1=1 ,1|0=1 ,0|1 =1 ,0|0=0

	unsigned char ch = 169;  //1010 1001
	unsigned char ch1 = 240; //1111 0000

	/*
		1010 1001
	|	1111 0000
	--------------------
		1111 1001=(249)10
	*/

	printf("%d", ch | ch1);


	putchar('\n');

	system("pause");
}

在这里插入图片描述

//或运算 :与1相或 都变成1 ;1|1=1 1|0=1
//与0相或 结果不变 0|1=1 0|0=0

void main()
{
	unsigned char ch = 169;  //1010 1001
	unsigned char ch2 = 15; //0000 1111
	/*
		1010 1001
	|	0000 1111
	---------------
		1010 1111=(175)10
	*/


	printf("%d", ch | ch2);



	putchar('\n');
	system("pause");
}

在这里插入图片描述

五:位 异或 ^

位异或运算的操作符为^,将对两个操作数的每一位进行异或运算。通俗地讲,如果位“异或”运算的两个位相同(同为0或同为1),结果为0,若两个位不同(一个为0,另一个为1),结果为1,对应的准则为:
1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 0=0 (相同为 0 ;不同为 1)

#include<stdio.h>
#include<stdlib.h>

//异或运算 : 1^1=0 ; 0^0=0 ; 1^0=1 ; 0^1=1  (相同为0 不同为1)
void main()
{
	unsigned char ch = 169;  //1010 1001
	unsigned char ch2 = 15; //0000 1111
	/*
		1010 1001
	^	0000 1111
	----------------
		1010 0110
	*/

	printf("%d", ch ^ ch2);

	putchar('\n');
	system("pause");
}

在这里插入图片描述
实现反转: 异或可以实现反转 :与1相异或 1^1=0 ,0 ^ 1 =1 。无论是0 或 1 与1相异或都会发生逆转

//异或可以实现反转 :与1相异或  1^1=0 0^1=1
//无论是0 或 1 与1相异或都会发生逆转
void main()
{
	unsigned char ch = 169;  //1010 1001
	unsigned char ch1 = 255; //1111 1111

	/*
		1010 1001
	^	1111 1111
	----------------
		0101 0110
	*/
	
	printf("%d", ch ^ ch1);


	putchar('\n');
	system("pause");
}

在这里插入图片描述

//指定位反转
//与0相异或保持不变 :0^0=0 0^1=1 无论是 1或0 与0发生相异或都不会变化
void main()
{
	unsigned char ch = 255; //1111 1111
	unsigned char ch1 = 60; //0011 1100
	
	/*反转中间4位
		1111 1111
	^	0011 1100
	----------------
		1100 0011=(195)10
	*/

	printf("%d", ch ^ ch1);


	putchar('\n');
	system("pause");
}

在这里插入图片描述

//异或实现交换两个变量

void main()
{
	unsigned char ch1 = 20; // 0001 0100
	unsigned char ch2 = 10; // 0000 1010

	printf("交换前 :%d ,%d", ch1, ch2);

	ch1 = ch1 ^ ch2;
	/*
		0001 0100
	^	0000 1010
	----------------
		0001 1110 =ch1
	*/


	ch2 = ch2 ^ ch1;
	/*
		0000 1010
	^	0001 1110
	----------------
		0001 0100 =ch2
	*/


	ch1 = ch1 ^ ch2;
	/*
		0001 1110
	^	0001 0100
	----------------
		0000 1010 =ch1
	*/
	//-->ch1=0000 1010
	//-->ch2=0001 0100

	printf("\n交换后 :%d ,%d", ch1, ch2);
	putchar('\n');
	system("pause");

}

在这里插入图片描述

移位运算 ‘<<’ 左移 和 ‘>>’ 右移

#include<stdio.h>
#include<stdlib.h>



/*
左移 <<
右移 >>
*/
void main1()
{
	unsigned char ch = 1; // 0000 0001

	printf("%d", ch << 1); //0000 0010

	printf("\n%d", ch << 3);

	printf("\n%d", ch );//左移位不会改变原来的值
	printf("\n%d", ch=(ch<<4));//通过赋值符号改变原来的值 ,左移一位 等价与乘以2

	system("pause");
}

在这里插入图片描述

//左移注意数据溢出
void main()
{
	unsigned char ch = 1; // 0000 0001

	
	printf("%d\n", ch << 7); //0100 0000 输出64

	printf("%d", ch << 8); //1 0000 0000  输出256 ,数据长度超过 char类型的长度,读取不到
	ch = (ch << 8);
	printf("\n%d", ch); //输出0  数据长度超过 char类型的长度,读取不到
	

	system("pause");
}

在这里插入图片描述

void main()
{
	unsigned char ch = 128; // 1000 0000

	printf("%d\n", ch >> 1);

	printf("%d\n", ch >> 2); 
	
	printf("%d\n", ch); //右移操作也不会改变原来变量的值。 移位运算是在CPU寄存器中操作的

	ch = (ch >> 2); //通过赋值操作符改变原来的值 ,右移一位等价与除以2
	printf("%d\n", ch);


	system("pause");
}

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14387.html

(0)
上一篇 2024-02-26 18:26
下一篇 2024-02-29 15:26

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信