0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言基础(7)--位运算

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2023-06-29 11:25 次阅读

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。C语言中位运算符: &(按位与)、| (按位或)、~(按位取反)、 <<(左移)、>>(右移) 、^(异或运算)。

计算机所能识别的即为二进制数,位运算就是按位运算, 因而同等情况下位运算效率一般都高于其它方式。

1.位运算特性

unsigned char a=0x45,b=0x89; a=0x45(0100 0101) b=0x89(1000 1001)

位运算

规则

示例

&(按位与)

全1为1,有0则0 a&b=0x1(0000 0001b)
|(按位或) 有1为1,全0则0 a|b=0xcd(1100 1101b)

~(按位取反)

对每一位进行取反,1变0,0变1

~a=0xba(1011 1010)

~b=0x76(0111 0110)

<<(左移)

高位溢出,低位补0

(a<<1)=0x8a(1000 1010)

(b<<1)=0x12(0001 0010)

>>(有移)

低位溢出,高位补0

(a>>1)=0x22(0010 0010)

(b>>1)=0x44(0100 0100)

^(异或运算)

相同为0,不同为1

a^b=0xcc(1100 1100)

  • 优先级关系:

~(取反)

<<(左移)   >>(右移)

&按位与

^(按位异或)

|(按位或)

2.示例

#include < stdio.h >
int main()
{
	unsigned char a=0x45,b=0x89;
	printf("与运算a&b:%#xn",a&b);
	printf("或运算a|b:%#xn",a|b);
	printf("取反运算~a:%#xt ~b:%#xn",~a&0xff,~b&0xff);
	printf("左移a< <1:%#xt b< <1:%#xn",(a< <1)&0xff,(b< <1)&0xff);
	printf("右移a >>1:%#xt b>>1:%#xn",a>>1,b>>1);
	printf("异或a^b:%#xn",a^b);
}

[wbyq@wbyq 123]$ gcc main.c 
[wbyq@wbyq 123]$ ./a.out 
与运算a&b:0x1
或运算a|b:0xcd
取反运算~a:0xba	 ~b:0x76
左移a< <1:0x8a	 b< <1:0x12
右移a >>1:0x22	 b>>1:0x44
异或a^b:0xcc

3.位运算练习

1.定义两个变量unsigned char a=0x45,b=0x89;将a的第6位清0,将b的第4位置1;

2.定义两个整型变量a,b将a,b的值交换位置(不借助第三个变量,使用位运算);

3.定义一个整型变量data,将字符'a'、'b'、'c'、'd' 保存到data中,并输出字符abcd;

4.汉字点阵输出

汉字显示我们每时每刻都在使用,那汉字是如何显示在屏幕上的呢?通过位运算的学习我们即可通过printf模拟函数输出显示。

例如我们需要在一个8*8的点阵方格中显示一个”中”字。可以看做如下:

poYBAGSc9iqARdIqAABxOpq1SOk594.png

一个有8个格子,刚好一个字节有8位,一个方格中有两个状态:空白和显红。我们可以把空白的地方看做0,把显示红色的地方看做1,这样整个8*8个格我们就可以用8个字节表示,坐标为高位,右边为低位,高位在前方式。表示如下:

第一行:0x08;

第二行:0x08;

第三行:0x3e;

第四行:0x2a;

第五行:0x2a;

第六行:0x3e;

第七行:0x08;

第八行:0x08;

通过位运算实现如下:

#include < stdio.h >
const unsigned char buff[]={0x08,0x08,0x3E,0x2A,0x2a,0x3e,0x08,0x08};
int main()
{
	int i,j;
	unsigned char temp;
	for(i=0;i< 8;i++)
	{
		temp=buff[i];
		for(j=0;j< 8;j++)/*一个字节有8位数据*/
		{
			if(temp&0x80)
			{
				printf("*");
			}
			else 
			{
				printf(" ");
			}
			temp< <=1;//继续判断下一位数据
		}
		printf("n");
	}
}
pYYBAGSc9pSALOMzAABvXDkjCjY385.png

5.汉字显示练习

1.通过PCtoLCD2002工具实现汉字取模进行取模,封装汉字显示函数,以横向和纵向两种方式显示。

pYYBAGSc-WGAYx-MAATMgmmPFhc021.png
#include < stdio.h >
#define FONT_SIZE 24
const char buf[][24*24/8]=
{
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x31,0xC0,0x00,0x7F,0xE0,0x0F,0xF0,0xE0,0x0E,0x30,0xE0,0x06,0x3F,0xC0,0x07,0xF9,0xC0,0x06,0x31,0x80,0x06,0x31,0x80,0x06,0xFF,0x00,0x03,0xF0,0x00,0x00,0x70,0x00,0x00,0x30,0x18,0x00,0x30,0x0C,0x00,0x38,0x1C,0x00,0x1F,0xFC,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"电",0*/

	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x7D,0xC0,0x01,0xE3,0xC0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x3C,0x00,0x00,0x1C,0x1C,0x00,0x0F,0xFE,0x0F,0xFC,0x00,0x3C,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0xFC,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x00,0x00},/*"子",1*/

	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x1C,0x00,0x00,0x1C,0xF0,0x01,0x9C,0x30,0x01,0xD8,0x00,0x01,0x99,0xE0,0x03,0xBF,0x80,0x03,0xF0,0x00,0x03,0x30,0x00,0x00,0x73,0x80,0x00,0x7F,0xC0,0x00,0xF3,0x80,0x00,0xFB,0x80,0x01,0xDF,0x00,0x01,0x8F,0x00,0x03,0x07,0x00,0x07,0x0F,0x80,0x0E,0x39,0xE0,0x18,0x60,0xF8,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00},/*"发",2*/

	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x03,0x9C,0x00,0x03,0x0D,0xC0,0x03,0x0F,0x00,0x03,0x1E,0x60,0x03,0xF7,0xE0,0x33,0xE3,0xC0,0x1B,0x83,0xCC,0x1F,0x06,0xFC,0x03,0x1C,0x1C,0x03,0x00,0xE0,0x03,0x1F,0xC0,0x07,0x8D,0x80,0x07,0xCD,0x80,0x06,0xDD,0x80,0x0E,0x19,0x86,0x0C,0x31,0x86,0x18,0x71,0xCE,0x30,0xC0,0xFC,0x00,0x00,0x00,0x00,0x00,0x00},/*"烧",3*/

	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,0x3B,0xF0,0x03,0xFF,0x00,0x07,0xB0,0x00,0x00,0x70,0x00,0x00,0x60,0x00,0x00,0x6F,0xC0,0x00,0xFB,0x80,0x00,0xC3,0x80,0x01,0xF3,0x80,0x03,0xBB,0x00,0x03,0x0F,0x00,0x06,0x07,0x00,0x0C,0x0F,0x80,0x18,0x1D,0xC0,0x70,0x38,0xF0,0x01,0xE0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"友",4*/
};


int main()
{
	int i,j,k,x;
	unsigned char temp;
	for(i=0;i< FONT_SIZE;i++)
	{
		for(k=0;k< 5;k++)
		{
			for(x=0;x< FONT_SIZE/8;x++)
			{
				temp=buf[k][i*FONT_SIZE/8+x];
				for(j=0;j< 8;j++)/*一个字节有8位数据*/
				{
					if(temp&0x80)
					{
						printf("*");
					}
					else 
					{
						printf(" ");
					}
					temp< <=1;//继续判断下一位数据
				}
			}
		}
		printf("n");
	}
}
pYYBAGSc-YqAaDenAAC3S0Cnd58292.png
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7414

    浏览量

    87698
  • 内存
    +关注

    关注

    8

    文章

    2998

    浏览量

    73874
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136140
  • 位运算
    +关注

    关注

    0

    文章

    16

    浏览量

    8413
收藏 人收藏

    评论

    相关推荐

    C语言基础知识(4)--运算

    C语言中,运算符包括有算术运算符、关系运算符、逻辑运算符和
    的头像 发表于 06-15 09:38 3387次阅读

    C语言运算符的使用方法

    详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、
    发表于 11-02 11:30 1490次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>运算</b>符的使用方法

    【跟我学单片机C语言】详解运算符和表达式的运算

    【跟我学单片机C语言】详解运算符和表达式的运算符学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机
    发表于 12-07 13:51

    C语言程序中运算的操作

    在标准C语言的的教材中,对于运算的操作是基本不涉及的,但是在单片机系统的程序中,需要经常操作各类以字节为单位的寄存器,而这些寄存器通常都是以二进制中的
    发表于 07-14 07:45

    嵌入式C语言运算的相关资料推荐

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档@[TOC]嵌入式C语言运算一、pandas是什么?1.与运算“&” 按
    发表于 12-15 07:22

    C语言运算与stm32调试原理介绍

    C语言运算:“|=”或运算,相应位置1“&=”与运算,相应
    发表于 02-23 06:52

    单片机c语言教程第八章--运算符和表达式(运算符)

    学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按操作,从而使单片机C
    发表于 04-15 09:38 1397次阅读

    C/C++语言运算详解

    运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制的问题。C语言提供了6个
    发表于 12-14 16:36 4574次阅读

    C语言教程之平方和运算的问题

    C语言教程之平方和运算的问题,很好的C语言资料,快来学习吧。
    发表于 04-25 15:03 0次下载

    C语言运算+实例讲解

    C语言运算有6种: &, | , ^(亦或), (右移)。 注意:参与运算的元素必须是in
    的头像 发表于 03-22 16:00 8574次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>位</b><b class='flag-5'>运算</b>+实例讲解

    C语言总结_语句、运算

    当前文章复盘C语言的: 运算运算符、基本运算符、数据类型、变量、for语句、while语句、g
    的头像 发表于 08-14 09:39 976次阅读

    C语言_语句与运算基本练习

    总结C语言语句的几个基本练习题,计算素数、排序、求偶数和、可逆素数、水仙花数、交换大小写、交换变量的值、运算、语法特性等知识点。
    的头像 发表于 08-14 09:46 978次阅读

    C语言-基本数据类型与运算

    这篇文章作为基础知识点,总结C语言的基本数据类型有哪些,浮点数的精度,整数变量的空间范围,变量定义语法,变量命名规则,浮点数打印格式,基本数据类型printf对应的打印、运算的知识点
    的头像 发表于 08-14 09:56 1538次阅读

    C语言中必须要掌握的运算操作

    C语言中,特别是在嵌入式的开发中,操作是很常用的一个知识点,涉及到按(bit)操作的地方也是很常见的。本文分享一些C
    的头像 发表于 02-10 14:19 1362次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中必须要掌握的<b class='flag-5'>位</b><b class='flag-5'>运算</b>操作

    C语言运算

    C语言中,我们常常会用到表达式,在使用表达式的过程中便会使用到运算符。C语言中,不同的运算符拥
    的头像 发表于 02-21 15:12 1153次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>运算</b>符