请教此程序中0x1 << 3何意?(0x1何意?)。我是菜鸟

goldendreams 2006-11-28 01:30:21
9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应
1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)
static int a;

void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。
...全文
2631 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
singlerace 2006-12-13
  • 打赏
  • 举报
回复
从哪儿翻译来的东西,看着乱七八糟的。其实用bit masks不用bit fields的一大原因是用bit masks做位操作效率更高。
bjyjy 2006-12-12
  • 打赏
  • 举报
回复
C语言呀的基本位操作,做底层开发都会用到的呀
TheSaviour 2006-11-28
  • 打赏
  • 举报
回复
干吗要左移?直接定义0x08有问题吗?浪费!
载舟之水 2006-11-28
  • 打赏
  • 举报
回复
- -!
KevinCEC 2006-11-28
  • 打赏
  • 举报
回复 1
a |= BIT3 相当 a = a | BIT3 相当 a = a | 0x0008;
a &= ~BIT3 相当 a = a & ~BIT3 相当 a = a & 0xFFF7;
KevinCEC 2006-11-28
  • 打赏
  • 举报
回复
楼上正解
相当于 #define BIT3 0x0008
micro0807 2006-11-28
  • 打赏
  • 举报
回复 4
0x表示此数为16进制表示方法
0x1表示为2进制就是0001
<<是移位操作
0x1<<3表示将0x1向左移3位
即0x1<<3 = 0001<<3 = 1000 = 0x8

19,519

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧