Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么是位移运算符?

为什么是位移运算符?
EN

Stack Overflow用户
提问于 2010-08-03 14:21:36
回答 5查看 2.7K关注 0票数 5

我不明白你什么时候以及为什么会在微芯片编程中使用位移位操作符:例如…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SWITCH_DDR &= ~SWITCH_BIT;   
SWITCH_PORT |= SWITCH_BIT;

为什么要使用这些运算符?

或者..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SerialInit(void)
{
   UBRRH = ((XTAL / (8 * 250000)) - 1)>>8;   // 250kbps at 16Mhz
   UBRRL = (XTAL / (8 * 250000)) - 1;
   UCSRA = (1<<U2X);
   UCSRB = (1<<TXEN);
   UCSRC = (1<<URSEL) + (1<<UCSZ1) + (1<<UCSZ0);
}

这是怎么回事?请有人用0和1图形化解释一下。下面是另一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ulong MesureLC(void)
{
 int i;

 TCCR1B = 0;
 CountHigh = 0;
 TCNT1 = 0;

 for (i=0;i<25000;i++)
 {
  TCCR1B = (1<<CS12) + (1<<CS11) + (1<<CS10);   // WTF ???
  UDR = 0x55;
  while(!(UCSRA & (1<<UDRE)));
 }
 while(!(UCSRA & (1<<TXC)));
 TCCR1B = 0;

 CountLow = TCNT1;
 Count = CountLow + (CountHigh << 16);

 return Count;
}

我需要理解这些东西。任何帮助都是非常感谢的。

EN

回答 5

Stack Overflow用户

发布于 2010-08-03 14:31:22

  1. 如果您有可以启用或禁用的功能,您可以使用单个位来设置状态:1或0。
  2. 如果你需要存储值(比方说从0到7),你只需要3位(000 in binary =0 in dec,001 = 1,010 = 2,...,111 = 7)。而且你还有8位中的5位可用。

这是怎么回事?请有人用0和1来图解一下

1 << 2= 00000001 << 2= 00000100 =4

4 >> 2= 00000100 >> 2= 00000001 =1

票数 5
EN

Stack Overflow用户

发布于 2010-08-03 15:19:14

我认为真正的问题不是“这到底意味着什么”,而是“为什么为微控制器编写程序的开发人员似乎喜欢这种方式?”

我不知道他们是不是那样爱。我根本不是一个开发人员,我只是对微控制器有一点兴趣,但这是我的想法。

你见过芯片的文档吗?这里有一个来自Atmel pdf的例子。

USART控制和状态寄存器- UCSRnB

·位7- RXCIEn: RX完成中断使能n将此位写入1可使能RXCn标志上的中断。仅当RXCIEn位写入1、SREG中的全局中断标志写入1且UCSRnA中的RXCn位被设置时,才会生成USART接收完成中断。

·位6- TXCIEn: TX完成中断使能n将此位写入1使能TXCn标志上的中断。仅当TXCIEn位写入1、SREG中的全局中断标志写入1且UCSRnA中的TXCn位被设置时,才会生成USART传输完成中断。

·位5- UDRIEn:...·位4- RXENn:...·位3- TXENn:...·位2- UCSZn2:...·位1- RXB8n:...·位0- TXB8n:...

问题是,芯片是通过设置或清除某些控制寄存器中的单个位来控制的。这些寄存器在文档中有难看的名称,位也有难看的名称。开发环境已经提供了所有的宏,它们的名称与文档定义的名称相似。

现在假设有人想要在RXCn标志上启用中断,并保持所有其他设置不变。这需要在一个特定寄存器中设置一个位,而其他位保持不变。运算符|=是完成此操作的最简单方法

假设寄存器的地址是0x3F (我虚构了这个数字,这并不重要),可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*((unsigned char*)0x3F) |= 0x80;// I want to set bit number 7 (RXCIEn)

现在,这个可读性如何?

在开发环境中,已经定义了像UCSRnBRXCIEn这样的宏,使用它们是显而易见的事情。碰巧RXCIEn是一个位数,而不是该位的值,所以要编写与上面相同的代码,必须编写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UCSRnB |= (1 << RXCIEn);

多亏了文档,比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UCSRnB = (1<<RXENn)|(1<<TXENn);

被认为可读性比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*((unsigned char*)0x3F) = 0x18; // I want to set bits number 4 and 3 (RXENn and TXENn)

文档本身充满了使用这些定义的宏的代码示例,我猜开发人员太快地习惯了它,试图找到更好的方法。

票数 4
EN

Stack Overflow用户

发布于 2010-08-03 15:00:58

在您给出的第一个示例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SWITCH_DDR &= ~SWITCH_BIT;   
SWITCH_PORT |= SWITCH_BIT;

这不是位移位,而是位掩码。

具体地说,第一个语句关闭值中的一个给定位,第二个语句打开相同的位,保持所有其他位不变。

假设SWITCH_DDR和SWITCH_PORT是控制某些设备行为的特殊内存值。它的每个位打开/关闭一个功能。如果你想单独控制一个给定的功能,你必须能够在不干扰其他功能的情况下进行一点更改。也就是说,由SWITCH_BIT控制的特性是字节中最左边的一位。因此,SWITCH_BIT的值为0x80 (二进制为10000000)。当您执行第一条语句时,您将使用~运算符反转SWITCH_BIT (以二进制形式获得01111111 ),并对SWITCH_DDR应用二进制and。这有效地清除了最左边的位,并保留了其他位不变。第二个语句执行二进制OR,因此得到相反的结果。

现在,关于移位操作,有很多应用程序(很多已经在另一个答案中提到了),我会简单地在你发布的代码中解释具体的用法。因此,您需要:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SerialInit(void)
{
   UBRRH = ((XTAL / (8 * 250000)) - 1)>>8;   // 250kbps at 16Mhz
   UBRRL = (XTAL / (8 * 250000)) - 1;
   UCSRA = (1<<U2X);
   UCSRB = (1<<TXEN);
   UCSRC = (1<<URSEL) + (1<<UCSZ1) + (1<<UCSZ0);
}

这里的事情类似于前面的例子(在值中设置特定的位),但由于情况的不同,有一些不同:

a)虽然在第一个示例中已经制作了位掩码(SWITCH_BIT),但这里的常量只是位的位置。例如,U2X包含需要打开/关闭的位的位置(从右到左),而不是它的位掩码。执行(1<<U2X)可以有效地生成相应的位掩码。如果需要打开的位在最左边(就像我在SWITCH_BIT示例中所做的那样),U2X将是7,移位的结果将是相同的二进制10000000。

b)在最后一行中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UCSRC = (1<<URSEL) + (1<<UCSZ1) + (1<<UCSZ0);

这是组合由每个常量产生的位掩码(同样,其值是从右起的位位置)。问题是程序员决定使用+运算符而不是二进制OR,因为他/她知道当你没有“碰撞”位时,他们的结果是相同的。就我个人而言,我总是使用二进制OR,以表明我所做的不是算术加法。

c)最后,关于第一行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UBRRH = ((XTAL / (8 * 250000)) - 1)>>8;

看起来更复杂,显然是时钟划分的因素,我必须看文档才能更好地理解。我现在不担心,它可能会在时间上变得清晰。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3397421

复制
相关文章
Python提取PPT中的图片
今天要带大家实现的是PPT图片的提取。在我们学习工作中,PPT的使用还是非常频繁的,但是自己做PPT是很麻烦的,所以就需要用到别人的模板或者素材,这个时候提取PPT图片就可以减少我们很多工作。
ZackSock
2021/10/08
2K0
如何提取PPT中的所有图片
1、 首先,我们打开一个含有图片的PPT,点菜单“文件”--“另存为”;在“另存为”对话框中,选择保存类型为“网页”,点保存; 2、打开我们保存文件的目录,会发现一个带有“******.files”的文件夹; 3、双击该文件夹,里面的文件类型很多,再按文件类型排一下序,看一下,是不是所有的图片都在里面了,一般图片为jpg格式的;
P轴
2022/11/18
7K0
PHP 提取富文本中的全部图片(提取文章中的全部图片)
未经允许不得转载:肥猫博客 » PHP 提取富文本中的全部图片(提取文章中的全部图片)
超级小可爱
2023/02/20
2.2K0
Python工具源码,Python批量提取PPT文件中的图片
在办公场景当中,同样也有这样一个需求,那就是快速批量把PPT文件中的图片提取出来,毕竟一个个点击另存为太过于繁琐,以及耗费时间,前面本渣渣分享过如何应用Python批量提取PDF文件中的图片,而这一篇本渣渣就为大家分享如何应用Python批量提取PPT文件中的图片。
二爷
2021/08/23
1.5K0
Python工具源码,Python批量提取PPT文件中的图片
1行代码,提取Word中的图片
程序员晚枫
2023/09/24
2600
1行代码,提取Word中的图片
Python脚本工具,PyMuPDF批量提取PDF文件中的图片
如何批量快速提取出PDF中的图片文件,你是否遇到这样的一个问题,尤其是PPT文件转换为PDF文件,需要快速提取其中的图片文件,如果你恰好会那么一点py,同时复制粘贴没问题的话,那么相信你也能够很轻松的解决这个问题。
二爷
2021/08/23
3.1K0
Python脚本工具,PyMuPDF批量提取PDF文件中的图片
使用Python批量提取并保存docx文档中的图片
如果实在看不懂上面的代码,但是又有同样的功能需要,可以把test.docx文件复制一份并把扩展名改为zip,文件名为“test_副本.zip”,然后解压缩,可以直接在word\media文件夹中得到文档中的图片,如下图所示。当然也可以把这个过程使用Python实现自动化,使用标准库zipfile和os就可以实现。
Python小屋屋主
2018/12/18
3.1K0
从相册中取图片
需要加载一个协议 UIImagePickerControllerDelegate //从手机相册中获得图片并显示在imageView中 - (IBAction)albumClocked:(id)sender {     //创建一个图片选择器     UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];     //设置选择器的资源类型     imagePicker.sourceType =UII
用户1219438
2018/02/01
1.2K0
小知识:如何从图片中提取文字
这个需求很简单,在工作中也很常见。 但就是这个简单的需求,通常也是要借助第三方工具/软件,网上去搜也有在线免费版的,但很多来源不明,安全性和稳定性都非常没有保障。
Alfred Zhao
2022/05/06
6.3K0
小知识:如何从图片中提取文字
python:如何从 URL 中快速提取域名?
有时候,我们要从一段很长的 URL 里面提取出域名。例如从https://www.kingname.info/2020/10/02/copy-from-ssh/,我需要获取的是kingname.info。
王图思睿
2021/06/16
9.1K0
Python提取图片文字内容
爬虫的时候,有时候会遇到一些验证码,常见的有滑块验证码和文字验证码,本文所讲内容将为解决文字验证码做一些准备!
远方的星
2021/06/20
12.8K0
Python提取图片文字内容
教你快速提取iOS App中的图片素材
2016-08-2819:40:36 发表评论 420℃热度 2.1 下载app安装包 2.2 利用工具获取图片资源 目录 平时玩手机,看到iOS app中许多不错的图片素材的时候,有木有很心动,
timhbw
2018/05/03
4.4K1
教你快速提取iOS App中的图片素材
三种方法,Python轻松提取PDF中全部图片
今天就跟大家系统分享几种Python提取 PDF 图片的方法。其实没有非常完美的方法,每种方法提取效率都不是百分之百,因此可以考虑用多种方法进行互补,主要将涉及:
刘早起
2021/02/05
8.6K0
Python 提取图片中的GPS信息
JPG图片中默认存在敏感数据,例如位置,相机类型等,可以使用Python脚本提取出来,加以利用,自己手动拍摄一张照片,然后就能解析出这些敏感数据了,对于渗透测试信息搜索有一定帮助,但有些相机默认会抹除这些参数。
微软技术分享
2022/12/28
1.5K0
Python提取docx文档中嵌入式图片和浮动图片的又一种方法
昨天推送了使用docx2python扩展库提取文档中图片的文章之后,经网友perfect提醒,实际上使用python-docx这个扩展库也可以提取浮动图片,并给出了参考代码。经过分析和测试,确实可以,然后根据分析我把perfect朋友给出的代码又简化改进了一下,思路如下:
Python小屋屋主
2019/11/28
2.8K0
python识别批量网站中的图片
实现方式: 下载网页源码,在源码中识别包含图片url的标签,如<img>,<div>,<li>。由于对html了解较少,哪些标签可能含有图片是从查看多个网站的源码中总结出来的。
py3study
2020/01/20
1.4K0
hexo博客中如何插入图片
Hexo的博文是支持Markdown格式的,发表一篇文章只需要简简单单的几个命令。
不作声
2020/10/30
4.4K0
hexo博客中如何插入图片
JAVA中如何图片异步上传
来源:程序员头条:http://www.90159.com/2015/12/15/java-upload-picture/ 在java中要实现异步上传要提前做好准备,对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。 这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在st
编程范 源代码公司
2018/04/16
2.4K0
Linux下从PDF文件中提取图片
PDF 其实本质上是一个文件包,比如某些 PDF 文件中有插图,这些插图都包含在这个 PDF 文件包中。Linux 下可以使用 pdfimages 命令来从 PDF 文件中提取图片文件。如果你的 Linux 发行版上没有该命令,需要安装 poppler-utils 软件。pdfimages 命令的语法格式如下:
hotarugali
2022/02/28
2.6K0
html中如何设置默认图片?
大家可能都知道img标签是怎么设置默认图片的,但是你知道background-img是如何设置默认图片的嘛?
Javanx
2019/09/04
5K0
html中如何设置默认图片?

相似问题

如何在JAVA中从图片URL中提取图片属性?

12

如何知道Android Notification大图片样式中的图片大小?

30

Python 3:如何提取url图片?

332

Selenium:如何从网站提取所有图片(包括javascript和css中的图片)

129

如何在android中编辑大图片?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文