实战项目开发细节:C语言分离一个16进制数取出相应的位1或0
最近在公司开发一个关于钢琴的PCBA项目,项目大概是这样的,完成各种功能的测试,准备去工厂量产的时候可以通过软件快速甄别硬件是否短路,断路等问题。
其中,甄别好坏的方法是通过比如按键,或者其它的操作然后响应音频信号的输出来甄别的,那到底原理是怎么样的呢?
音频信号定制为如果是0则输出1000hz,如果是1则输出3000hz。
音频信号是一个16进制数,比如0xfd----->1111 1101
那么它的输出应该是这样的,从左边最高位开始,输出3000hz ,3000hz ,3000hz, 3000hz , 3000hz , 3000hz , 1000hz , 3000hz .
如果要求改一下,从右边最低位到最高位输出也是可以的,这个具体可以通过示波器来测量相应的信号输出波形。
原理我们搞明白了,就这么简单,于是我们就可以用C语言位运算来实现这个操作,由于公司保密特权,我不方便公开我的项目的详细细节,这样,我只能写个模拟的C语言测试程序来模仿这个过程,好了,我们开始写代码:
#include <stdio.h>
void pri() ;
void pri1() ;
int play_sound_lowtohigh(unsigned int num) ;
int bit0o1(int it,int position) ;
int play_sound_hightolow(unsigned int num) ;
int main()
{
unsigned int num = 0xfd ; //1111 1101
play_sound_lowtohigh(num);
putchar('\n');
play_sound_hightolow(num);
return 0;
}
//从低位往高位
int play_sound_lowtohigh(unsigned int num)
{
int i = 0;
int bit = 0 ;
for(i = 1 ; i < 9 ; i++)
{
bit = bit0o1(num,i);
if(bit == 0)
pri();
else if(bit == 1)
pri1() ;
}
}
//从高位往低位
int play_sound_hightolow(unsigned int num)
{
int i = 0;
int bit = 0 ;
for(i = 8 ; i > 0 ; i--)
{
bit = bit0o1(num,i);
if(bit == 0)
pri();
else if(bit == 1)
pri1() ;
}
}
//it 表示数据
//position 表示第几位
int bit0o1(int it,int position)
{
int oc=1;
oc<<=(position-1);
return (oc&it)!=0?1:0;
}
void pri()
{
printf("1000hz\n") ;
}
void pri1()
{
printf("3000hz\n") ;
}
运行结果:
或者更简单一点:
#include <stdio.h>
int test_bit(int num)
{
int i ;
for(i = 7 ; i >= 0 ; i--)
{
if(num & (1 << i))
printf ("3000hz\n") ;
else
printf ("1000hz\n") ;
}
}
int main(void)
{
test_bit(0xfd) ;
}
这样也是对的。
实战项目开发细节:C语言分离一个16进制数取出相应的位1或0的更多相关文章
- C#一个16进制数用二进制数表示是几位?
1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...
- C语言:将16进制字符串转化为int类型值
将16进制字符串值转换为 int 整型值 此例中用 "1de" 作为测试字符串,实现代码如下: #include <stdio.h> #include <stdl ...
- 原生JS代码实现随机产生一个16进制的颜色值
封装一个函数 function getColor() { var str = "#"; //一个十六进制的值的数组 var arr = ["0", " ...
- JS一行代码,生成一个16进制随机颜色,简单粗暴。
var color = '#'+ Math.random().toString(16).substr(-6); document.body.style.backgroundColor = color; ...
- C语言版的16进制与字符串互转函数
http://www.cnblogs.com/nio-nio/p/3309367.html /* // C prototype : void StrToHex(BYTE *pbDest, BYTE * ...
- iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换
http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios ...
- java标签(label)求16进制字符串的整数和 把一个整数转为4个16进制字符表示
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4f76cb } p.p2 { margin: 0.0px 0. ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...
随机推荐
- Android的log日志知识点剖析
log类的继承结构 Log public final class Log extends Object java.lang.Object ↳ android.util.Log log日志的常用方法 分 ...
- JavaEE介绍
相关术语 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担.为了程 ...
- 迎战大数据-Oracle篇
来自:http://www.cnblogs.com/wenllsz/archive/2012/11/16/2774205.html 了解大数据带来的机遇: 透视架构与工具: 开源节流,获得竞争优势. ...
- [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视 ...
- Android简易实战教程--第十一话《获取手机所有应用信息Engine类详解》
如果想要获取系统手机应用的详细信息,那么下边代码可以直接作为模板使用.笔者对每一行代码都做了注解,供您参考.直接上代码: package com.example.itydl.engines; impo ...
- C语言一个双向链表的实现
首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下: #ifndef DList_H #define DList_H typedef int Item; typedef struct ...
- System.getProperty()的用途
偶尔用到 System.getProperty(),找起来也不方便.这里做下记录备忘: 编写的测试类: public class TestSystemproperty { public stat ...
- 操作系统处理内存时内存页为4k
windows和unix处理内存时,一个内存页的大小都为4k. 测试代码 int main() { while (1) { int *p = (int *)malloc(1024); getchar( ...
- ORACLE EBS常用表及查询语句(最终整理版)
建议去看参考二 参考一: call fnd_global.APPS_INITI ...
- cocos2dx深度检测与Zorder
cocos2dx里面有两个渲染队列,RenderQueue和TransparentRenderQueue.我们可以从Renderer::render()的代码看到: void Renderer::re ...