实战项目开发细节: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) ;
}

这样也是对的。

时间: 2024-10-31 22:31:22

实战项目开发细节:C语言分离一个16进制数取出相应的位1或0的相关文章

如何打开一个16进制的文档

问题描述 由于开发需要使用VB.NET制作16进制文本读取器,之前有用VB6.0开发了一个,可是NET与6.0差异比较大,请各位帮忙修改一下,使其可以正确读取!如下为VB6.0代码供各位前辈参考!PrivateSubCommand3_Click()Dimss()AsByte,iAsLongText1.Text=""Open"d:S30012"ForBinaryAs#1ss=InputB(LOF(1),#1)Close#1Fori=0ToUBound(ss)Ifi&g

c语言-输入一个十进制整数,依次转换成2到16进制数

问题描述 输入一个十进制整数,依次转换成2到16进制数 求大神帮帮忙做一下 我刚刚学C语言 程序代码 弄了好久都没弄出来 大神帮忙编一个程序代码 ,谢谢了 解决方案 #include <iostream> using namespace std; char metachar[] = "0123456789abcdef"; void tobasen(int x, int n) { if (x > 0) { tobasen(x / n, n); cout <<

vb6 算法 进制-一个16进制算法问题 VB6 求大神

问题描述 一个16进制算法问题 VB6 求大神 有3个示例 不知道是什么算法转换出来 求大神 000000 加密成 649D976C775C 895C32 加密成 6BA39C967A56 FFFFFF 加密成 79B0AD798D6A 解决方案 这个恐怕有点难度喔,常用的加密算法一个一个试?也有可能是自定义的算法,那更不行了,就算要破解,就三个样本也不行哇,,,看看大神降临吧

C语言:将16进制字符串转化为int类型值

将16进制字符串值转换为 int 整型值   此例中用 "1de" 作为测试字符串,实现代码如下:   [cpp] view plaincopy   #include <stdio.h>   #include <stdlib.h>   #include <string.h>   #include <ctype.h>      /*   * 将字符转换为数值   * */   int c2i(char ch)   {           /

进制转换-java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制

问题描述 java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制 java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制,但是老是运行出错.大神们能不能给个小例子解释一下,谢谢 解决方案 http://blog.csdn.net/vanezuo/article/details/6556768 解决方案二: 使用函数啊,你找一下,Java有相应的函数能做到 解决方案三: 如果你的程序出错,你贴出你的程序才知道. 也可以参考我给你的

c语言-C语言字符串怎么转化为16进制

问题描述 C语言字符串怎么转化为16进制 char str[10]="153"; 字符串如何转化为16进制数 解决方案 #include <stdlib.h> #include <stdio.h> int main(int argc, char* argv[]) { char str[10]="153"; int n = atoi(str); itoa(n, str, 16); printf("%s", str); ret

c语言-请问如何用C语言判断一个整型的数是否为回文数

问题描述 请问如何用C语言判断一个整型的数是否为回文数 请教各位大神,如何用C语言判断一个整型的数是否为回文数? 解决方案 http://blog.163.com/ah..zhangrui/blog/static/539258022009105111759703/ 解决方案二: 把数字截取成数,按下标比较就可以了 解决方案三: 左右判断 是否对称 http://blog.csdn.net/u012605629/article/details/44648377 解决方案四: 楼主,程序直接给你,够

Web开发:关于16进制颜色代码你又知道多少

开发:关于16进制颜色代码你又知道多少-"> 这有必要了解一颜色系统的概念: RGB:RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一.RGB色彩模式使用 RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值.RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在

运算符重载-用C++编程:定义一个四进制的类,重定义“+”号实现四进制数的累加。

问题描述 用C++编程:定义一个四进制的类,重定义"+"号实现四进制数的累加. 定义一个四进制的类,重定义"+"号实现四进制数的累加. 输入第一行输入所需要的四进制数的个数第二行开始,依次输入四进制数 输出所有输入四进制数累加的和 解决方案 又是作业贴啊,要是做的过程中有问题,LZ直接说遇到的问题吧 解决方案二: 我写了个简单的,你试试好用不,没有做输入判断,你输入一定不能输4或者4以上的数123+321+333=2103 #include ""