Tag: 二进制

将int写入C中的二进制文件时出现问题

我需要使用C的I / O函数将数据写入二进制文件。 以下代码导致运行时exception: #include “stdio.h” int main(int argc,char* argv[]) { FILE *fp = fopen(“path_to_file.bin”,”wb”); if(fp == NULL) { printf(“error creating file”); return -1; } int val = 4; fwrite((const void*)val,sizeof(int),1,fp); fclose(fp); return 0; } 代码在fwrite处死掉。 你能发现我做错了什么吗? 显然,我正试图访问0x0000004或类似的数据。 谢谢 !

浮点模数运算

我正在尝试实施三角函数的范围缩减操作。 但相反,我认为对输入数据执行模数pi / 2操作可能会更好。 我想知道什么算法存在并且对于32位IEEE 754浮点的操作有效? 我必须在汇编中实现这个,所以fmod,除法,乘法等只有一条指令不可用。 我的处理器使用16位字,我实现了32位浮点加法,减法,乘法,除法,平方根,余弦和正弦。 我只需要范围缩减(模数)来输入余弦和正弦值。

逐位读取二进制文件

我知道下面的function: size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); 它只能逐字节读取,我的目标是能够一次读取12位然后将它们放入一个数组中。 任何帮助或指针将不胜感激!

在C位中,乘以3除以16

我的一个伙伴有这些谜题,这是一个让我望而却步的谜题。 这是问题,你得到一个数字,你想要返回该数字乘以3并除以16舍入为0.应该很容易。 赶上? 你只能使用! 〜&^ | + <>运算符和它们只有12的组合。 int mult(int x){ //some code here… return y; } 我的尝试是: int hold = x + x + x; int hold1 = 8; hold1 = hold1 & hold; hold1 = hold1 >> 3; hold = hold >> 4; hold = hold + hold1; return hold; 但这似乎并没有起作用。 我想我有丢失的问题,但我似乎无法想出一种拯救它们的方法。 另一种观点是好的。 […]

这是做什么的?

可能重复: C中的三元(条件)运算符 这是我老师协助的代码示例。 我不知道total = total*2+ (n==’1′? 1:0); 确实。 我认为它将总数乘以2,但是问号与1:0比率是多少? int bcvt(FILE *infile){ char n; int i, total=0; for(i=0; i<32; i++){ fscanf(infile, "%c", &n); total = total*2+ (n=='1'? 1:0); } char dummy; fscanf(infile, "%c", &dummy); return total; }

如何将IEEE 754单精度二进制浮点数转换为十进制?

我正在研究一个需要将32位数转换为十进制数的程序。 我从输入中得到的数字是一个32位数字,表示为浮点数。 第一位是符号,接下来的8位是指数,其他23位是尾数。 我在C中使用该程序。在输入中,我将该数字作为char[]数组,然后我创建一个新的int[]数组,其中存储符号,指数和尾数。 但是,当我试图将它存储在某种数据类型中时,我对尾数有问题,因为我需要将尾数用作数字,而不是数组: formula=sign*(1+0.mantissa)*2^(exponent-127) 。 这是我用来存储尾数的代码,但程序仍然会得到错误的结果: double oMantissa=0; int counter=0; for(counter=0;counter<23;counter++) { if(mantissa[counter]==1) { oMantissa+=mantissa[counter]*pow(10,-counter); } } mantissa[]是一个int数组,我已经从char数组中转换了尾数。 当我从formula得到值时,它必须是二进制数,我必须将其转换为十进制,所以我将得到数字的值。 你可以帮我存储23位的尾数吗? 并且,我不能使用像strtoul这样的函数将32位数字直接转换为二进制数。 我必须使用formula 。

Int到二进制转换的解释

我的问题基于这篇文章: 十进制到二进制 ,它是选择的解决方案。 我可以让选择的答案代码工作,但它只适用于5位。 如何修改此代码以适用于更大的数字,比如8位? 我尝试将第一行中的字符偏移从5调整为8,但没有成功。 void getBin(int num, char *str) { *(str+5) = ‘\0’; int mask = 0x10 <>= 1) *str++ = !!(mask & num) + ‘0’; } 并使用给定的代码进行测试,再次调整6到9以匹配上面的函数: int main() { char str[6]; getBin(10, str); printf(“%s\n”, str); return 0; } 但输出仍然只显示前五位然后给出随机符号。 当我调整这些数字时,有人可以解释一下究竟发生了什么,这样我就可以将其用于8(或任何其他大小)位转换吗?

在C中匹配二进制模式

我正在开发一个需要解析一些定制数据结构的C程序,幸运的是我知道它们是如何构造的,但是我不知道如何在C中实现我的解析器。 每个结构的长度为32位,每个结构都可以通过它的二进制签名来识别。 例如,我感兴趣的有两种特殊结构,它们具有以下二进制模式(x表示0或1) 0000-00xx-xxxx-xxx0 0000-10xx-10xx-xxx0 在这些结构中,’x’位包含我需要的实际数据,因此基本上我需要一种基于每个结构中如何写入位来识别每个结构的方法。 所以作为伪代码中的一个例子: if (binaryPattern = 000010xxxxxxxxx0) { do something with it; } 我猜测将它们作为整数读取,然后执行某种bitmasking将是要走的路,但我对C的了解不是很好,也许一个简单的逻辑OR运算就可以做到,但我只想要一些在我开始之前做这个的建议。 谢谢 非常感谢所有回答的人,非常有帮助!

在C中将hex转换为二进制

可能重复: 使用sscanf将长hex字符串转换为int数组 我之前已经看过一些关于这方面的主题,但大多数解决方案都是用Python编写的(诅咒你是如此简单!)。 在C中有一个简单的方法吗? 这就是我的解决方案所需要的。我知道它在概念上并不复杂,但我对C字符串操作和地址处理非常可怕。 谢谢你的帮助,伙计们! – – – – – 编辑 – – – – – – – 好的,所以我解决了这个问题,我有另一个问题(我不想打开一个新线程!)。 下面是我对给定代码的修改,包括函数调用和输出。 void htoi(const char *ptr, char *binAddr) { char value[32] = “”; char ch = *ptr; int i; const char* quads[] = {“0000”, “0001”, “0010”, “0011”, “0100”, “0101”, “0110”, “0111”, “1000”, “1001”, “1010”, “1011”, “1100”, […]

仅使用按位运算符执行二进制算术运算

可能重复: 如何仅使用位移和加法进行乘法和除法? 我必须编写函数来执行二进制减法,乘法和除法,而不使用除循环控制之外的任何算术运算符。 我之前只用Java编写代码,所以我很难绕过这个问题。 从减法开始,我需要用原型编写一个函数 int bsub(int x, int y) 我知道我需要将y转换为二的补码以使其为负并将其添加到x,但我只知道如何通过使用一个补码运算符并添加1来实现这一点,但我不能使用+运算符。 提供了badd函数,如果我能弄清楚如何制作负数,我将能够在bsub中实现它。 badd的代码如下所示。 提前感谢任何提示。 int badd(int x,int y){ int i; char sum; char car_in=0; char car_out; char a,b; unsigned int mask=0x00000001; int result=0; for(i=0;i<32;i++){ a=(x&mask)!=0; b=(y&mask)!=0; car_out=car_in & (a|b) |a&b; sum=a^b^car_in; if(sum) { result|=mask; } if(i!=31) { car_in=car_out; } else { if(car_in!=car_out) { printf("Overflow occurred\n"); […]