[学习笔记]达内纪录片day03 位运算及逻辑运算

    选择打赏方式

今天在达内学习了C语言的位运算和逻辑运算,大体上是理解了,做一下记录,留下的坑过几天填上去。

把达内发下来的笔记最重要的部分,微小的润色一下,再发上来。


一、按位与

按位与(&)可以把对应数位的内容做与计算
只要一个数位内容是0则与计算以后结果就是0


内存情况:
    3      0000 0011
&  5      0000 0101
            0000 0001


任何数位内容和0做按位与结果一定是0
任何数位内容和1做按位与结果保持不变


用途:

1.从一个数字中单独获得某些二进制数位的内容

如:判断奇偶

任意数的二进制形式第0位为1为奇数,否则为偶数,所以任意数和1做位于运算即可判断奇偶

代码:

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

int main()
{
	int a;
	printf("请输入一个整数:\n");
	scanf_s("%d", &a);
	if (a & 1)
		printf("%d是奇数\n", a);
	else
		printf("%d是偶数\n", a);

	system("pause");
	return 0;
}



结果:

TIM截图20190702232654.png

2.可以利用按位与把一个数字的某些数位内容设置成0
0110 1011 & 1101 1111 结果是0100 1011


内存情况:
    107      0000 0011
&     5      0000 0101
               0000 0001
如:任意字母转到大写

原理:从二进制位上来看,所有小写字母的ASCII码的第三高位恒为1,而大写字母恒为0

代码:


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

int main()
{
	char c = 0;
	printf("请输入一个小写字母:");
	c = getchar();
	c &= -33;	//1101 1111
	printf("%c\n",c);
	system("pause");
	return 0;
}


结果:

TIM截图20190702235734.png


二、按位或
按位或(|)可以把对应数位的内容做或计算
只要一个数位的内容是1则或计算以后结果就是1

内存情况:
     3     0000 0011
|    5     0000 0101
            0000 0111

任何数位内容和0做按位或保持不变
任何数位内容和1做按位或结果是1


用途:
可以利用按位或把某些数位内容设置成1

如:任意字母转小写

代码:

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

int main()
{
	char c = 0;
	printf("请输入一个大写字母:");
	c = getchar();
	c |= 32;	//0010 0000
	printf("%c\n",c);
	system("pause");
	return 0;
}


结果:


TIM截图20190703000125.png

三、按位异或
按位异或(^)可以把对应数位的内容做异或计算
如果两个数位内容一样则异或以后结果是0,否则结果是1

内存情况:
     3     0000 0011
^  5     0000 0101
           0000 0110

任何数位内容和0做按位异或结果保持不变
任何数位内容和1做按位异或结果变成相反数

用途:
1.可以利用按位异或把某些数位内容变成相反数
如:字母大小写反转(利用按位异或取位相反数的特性)

代码:

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

int main()
{
	char c = 0;
	printf("请输入一个任意字母:");
	c = getchar();
	c^= 32;	//0010 0000
	printf("%c\n",c);
	system("pause");
	return 0;
}


结果:

TIM截图20190703001707.png


2.交换2个变量的值

代码:

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

int main()
{
	int a = 3,b=7;
	a ^= b;
	b ^= a;
	a ^= b;
	printf("a=%d,b=%d\n",a,b);

	
	system("pause");
	return 0;
}



四、移位操作

移位操作可以把一个数字的所有二进制
数位内容统一向左或向右移动n个位置,空的数位里填上新数字


内存情况:
TIM截图20190703002833.png

<<表示向左移位
>>表示向右移位
它们都是双目位操作符
左边的数字将要进行移位操作
右边的数字是移动的位数
如:3 << 2  对3进行向左移动2位的操作

数字填充规则:
向左移位后右边空出来的数位里固定填充0


无符号类型数字右移时左边空出来的数位里填充0
(无符号类型)
1000 0101 >> 2    0010 0001

有符号类型数字右移时左边空出来的数位里填充符号位的内容
(有符号类型)
1000 0101 >> 2    1110 0001

向左移动n位通常相当于乘以2的n次方
向右移动n位通常相当于除以2的n次方


综合演示:

利用按位与和位的左右移动取整数二进制位

实现思路:

既然按位与运算的,和0运算结果为0,和1运算结果不改变,那我们可以让每一位分别和1运算


老师标答: 

声明一个unsigned char变量,赋初值0x80,即:1000 0000,和目标数做按位与运算,之后右移一位,得到0100 0000,如此反复,直到0000 0001。

注意一定要unsigned char,如果是char,会变成在前面填充1,即1000 0000,右移一位,得到1100 0000,使得左边的位置1,无法单独获取每一位的结果。

代码如下:


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

int main()
{
	int val = 0;
	unsigned char ch = 0x80;	//1000 0000
	//接收用户输入
	printf("请输入一个整数:");
	scanf_s("%d",&val);
	printf("结果:");
	//实际运算过程
	printf("%d",(val & ch)!=0);//7
	ch >>= 1;	//0100 0000
	printf("%d", (val & ch) != 0);//6
	ch >>= 1;	//0010 0000
	printf("%d", (val & ch) != 0);//5
	ch >>= 1;	//0001 0000
	printf("%d", (val & ch) != 0);//4

	printf(" ");//空格

	ch >>= 1;	//0000 1000
	printf("%d", (val & ch) != 0);//3
	ch >>= 1;	//0000 0100
	printf("%d", (val & ch) != 0);//2
	ch >>= 1;	//0000 0010
	printf("%d", (val & ch) != 0);//1
	ch >>= 1;	//0000 0001
	printf("%d", (val & ch) != 0);//0
	//换行
	printf("\n");
	system("pause");
	return 0;
}


结果:

TIM截图20190703203512.png

在老师公布标准答案之前,我也写了份,更加简单粗暴,但是,不是所有人都能理解。

我并没有定义一个变量每次右移,而是定死了一个值,1,即0000 0001。

既然,任何位和0运算都是0,那就让目标数的每一位分别和0000 0001的1做一次按位与运算,至于其他位,随便是什么都可以,反正它们右移后只能前面填充0,没有被填充的也会和0运算被置0,每次只有一个有效位参与按位与运算,并get到结果。

代码:

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

int main()
{
	int val = 0;
	unsigned char ch = 0x80;	//1000 0000
	//接收用户输入
	printf("请输入一个整数:");
	scanf_s("%d",&val);
	printf("结果:");
	//实际运算过程
	printf("%d", val >> 7 & 1);
	printf("%d", val >> 6 & 1);
	printf("%d", val >> 5 & 1);
	printf("%d", val >> 4 & 1);

	printf(" ");

	printf("%d", val >> 3 & 1);
	printf("%d", val >> 2 & 1);
	printf("%d", val >> 1 & 1);
	printf("%d", val & 1);

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


结果依然是一样的

THE END!


版权声明:若无特殊注明,本文皆为《 8964CN 》原创,转载请保留文章出处。
本文链接:[学习笔记]达内纪录片day03 位运算及逻辑运算 http://www.8964cn.net/?post=64
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!