我正在开发一个C项目,我有一些类型的说明:
add $1 $2 $3
所以我正在读取这一行作为一个字符串,解析它并有一个相应的整数添加,比如说2.可以有人请告诉我如何将其转换为二进制以便将其写入文件?
寄存器为5位,操作为6位。总数将为32(最后10位未使用)。
因此寄存器存储在op[] = "2"
,char r1[] = "1"
,char r2[] = "2"
等中(注意寄存器编号可以高达31)。任何人都可以给我一个函数示例,它将以000010 00001 00010 00011 0000000000
答案 0 :(得分:2)
最简单的方法是使用位字段:
struct code {
unsigned opcode : 6;
unisgned operand1 : 5;
unisgned operand2 : 5;
unisgned operand2 : 5;
} test_code;
现在您可以简单地分配给不同的成员:
test_code.opcode = 0x02;
test_code.operator1 = 0x01;
test_code.operator2 = 0x02;
test_code.operator3 = 0x03;
答案 1 :(得分:0)
atoi(op)会给你2,所以你可以把它串在一起
只要将它放入您想要的结构中,只需创建一个包含位域的结构并将其放在带有32位无符号整数的并集中,您就可以直接获取该值。
答案 2 :(得分:0)
快速伪代码
const char* int32_to_bin(int32_t value) {
int pos = 0;
char output[33];
while(value > 0) {
if (value & 1) output[pos++] = '1';
else output[pos++] = '0';
value >>= 1;
}
output[pos] = 0;
return output;
}
答案 3 :(得分:0)
你问的是一个C问题,但你标记为objective-c所以我将覆盖它们。
<强> C:强>
这些变量如op[]..
实际上定义为char op[..]
(不确定你的长度),当然是C字符串。
因此操作为6位,每个寄存器为5位,即15 + 6 = 21位字。我假设前11位是零。
你需要的是另外4个整数变量:
int opint; int r0int; int r1int; int r2int;
您希望这些字符串的整数值进入这些整数。您可以使用atoi()来实现此目的,例如opint = atoi(op);
现在你已经得到了从字符串派生的整数,你需要创建32位字。最简单的方法是首先创建一个整数,将这些位保存在正确的位置。你可以这样做(假设32位整数):
int word = 0;
word |= ((opint & 0x3f) << (21 - 6))) |
(r0int & 0x1f) << (21 - 11)) |
(r1int & 0x1f) << (21 - 16))
(r2int & 0x1f));
&lt;&lt;正在转移到位。在此之后,你应该正确形成整数这个词。接下来,只需将其转换为二进制表示(如果这是必要的?不确定您的应用程序)
<强>目标C 强>
唯一的区别是我假设这些字符串以NSString *op;
等开头。在这种情况下,按opint = [op intValue];
获取整数,然后按照我的描述形成单词。
答案 4 :(得分:0)
此代码将字符串转换为二进制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* stringToBinary(char* s) ;
void binchar(char output[], char character);
void itoa(int value, char* str, int base);
int main(int argc, char const *argv[])
{
printf("%s\n", stringToBinary("asdf") );
}
char* stringToBinary(char* s) {
if(s == NULL) return 0; /* no input string */
size_t len = strlen(s);
char *binary = malloc(len*8 + 1); // each char is one byte (8 bits) and + 1 at the end for null terminator
int i =0;
char output[9];
for(i=0; i< len; i++){
binchar(output, s[i]);
strcat(binary,output);
}
return binary;
}
void binchar(char output[], char character)
{
//char output[9];
itoa(character, output, 2);
}
// since GCC is not fully supporting itoa function here is its implementaion
// itoa implementation is copied from here http://www.strudel.org.uk/itoa/
void itoa(int value, char* str, int base) {
static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
char* wstr=str;
int sign;
// Validate base
if (base<2 || base>35){ *wstr='\0'; return; }
// Take care of sign
if ((sign=value) < 0) value = -value;
// Conversion. Number is reversed.
do *wstr++ = num[value%base]; while(value/=base);
if(sign<0) *wstr++='-';
*wstr='\0';
// Reverse string
void strreverse(char* begin, char* end);
strreverse(str,wstr-1);
}
void strreverse(char* begin, char* end) {
char aux;
while(end>begin)
aux=*end, *end--=*begin, *begin++=aux;
}