1

我有以下内容:

char *pointer = decimal_to_binary(192) // yields 11000000
char *pointer2 = decimal_to_binary(168) // yields 10101000

我正在尝试将它们连接成:

1100000010101000

我正在参考:连接不同长度的二进制数,目前正在使用:

unsigned long pointer3 = (*pointer << 16) | *pointer2;

这给出了输出:

1100010000000000110001

我究竟做错了什么?

4

5 回答 5

1

您没有展示如何打印任何内容,这使得您的问题难以解释。pointer然而,这个语句被不可挽回地破坏了,因为它对连接and指向的字符串没有任何作用pointer2

unsigned long pointer3 = (*pointer << 16) | *pointer2;

这采用pointer指向 (a 1) 的第一个字符并将值左移 16 位,然后在pointer2指向 (another 1) 的第一个字符中添加 (or),并将整数分配给 misnamed pointer3。因此,它得到值:

pointer3 = 0x00310031;

这个问题需要一些解释,但做出一些合理(但不一定准确)的假设,这段代码可能会做你所追求的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char *decimal_to_binary(unsigned char byte)
{
    char *result = malloc(9);
    if (result != 0)
    {
        char *digit = result;
        for (int i = 0; i < 8; i++)
            *digit++ = ((byte >> (7 - i)) & 0x01) + '0';
        *digit = '\0';
    }
    return result;
}

int main(void)
{
    char *pointer1 = decimal_to_binary(192);
    char *pointer2 = decimal_to_binary(168);
    char  concatenated[17];
    unsigned long pointer3 = (*pointer1 << 16) | *pointer2;

    strcpy(&concatenated[0], pointer1);
    strcpy(&concatenated[8], pointer2);

    printf("P1 = <<%s>>; P2 = <<%s>>; P3 = 0x%08lX; C = <<%s>>\n",
           pointer1, pointer2, pointer3, concatenated);

    free(pointer1);
    free(pointer2);
    return(0);
}

输出:

P1 = <<11000000>>; P2 = <<10101000>>; P3 = 0x00310031; C = <<1100000010101000>>

请注意,使用的代码decimal_to_binary()并未注意避免(错误)使用空指针。的设计decimal_to_binary()也不尽如人意;那些free()电话很容易被遗忘。更好的设计是:

void decimal_to_binary(unsigned char byte, char buffer[9]);

其中调用代码提供写入二进制输出的缓冲区。还有其他编写循环的方法decimal_to_binary(); 有些甚至可能比这里选择的更有效。

于 2013-04-18T05:07:11.420 回答
1

好的,首先你不应该用整数初始化指针;编译器可能会这样警告你:

warning: initialization makes pointer from integer without a cast [enabled by default]
   char* pointer1 = 0xc0;

如果您不熟悉十六进制表示法,请参考这里;例如,您会看到从二进制转换为十六进制比从十进制转换为十六进制要简单得多。

如果您想表示这些 8 位数字,您可以将它们直接分配给unsigned char变量,就像我在这里所做的那样(例如,将此代码粘贴到文件“test.c”中):

#include <stdio.h>

void main() {
  unsigned char num1 = 0xc0; /* Same as binary 11000000 in hex */
  unsigned char num2 = 0xa8; /* Same as binary 10101000 in hex */

  unsigned long result = (num1 << 8) | num2;
  printf("0x%x\n", result);
}

您可以使用 编译它gcc -o test test.c,它在运行时输出:(0xc0a8这与 1100000010101000 相同)。

*pointer如果您像以前那样将数字分配给指针,当您尝试使用and取消引用它们时,您可能会遇到“分段错误”或“访问冲突” *pointer2,因为这意味着您希望将值存储在指针地址中,这可能不在您的程序地址空间中。

由于result是长(32 位),它肯定可以很好地保存您的 16 位数字,但num1必须num2unsigned char,所以当您左移和 OR 时,它不会使整个事情变成负数 - 在有符号的二进制文件中number 最左边的位设置为 1 意味着它是一个负数,所以如果你使用普通的char,它会符号扩展 32 位结果,所以它仍然是负数:0xffffffa8

于 2013-04-18T04:08:46.867 回答
0

首先只在指针中分配一个数字,就像 在这16 次 unsigned long pointer3 = *pointer; 左移之后一样。pointer3pinter3=pointer3<<16; pointer3=pointer3|*pointer2;

我认为这会起作用

于 2013-04-18T04:02:02.813 回答
0

不需要像你在做的那样移动 16

unsigned long pointer3 = (*pointer << 16) | *pointer2;

指针只需要移动 8。
以下代码将实现您想要做的事情。

#include <stdio.h>
#include <string.h>

void print_binary(int num) {
    short rem[16] = {0};
    for (short i = 1; i <= 16; i++) {
        rem[16-i] = num%2;
        num = num >> 1;
    }
    for (short int i = 0; i < 16; i++) {
        printf("%d", rem[i]);
    }
    printf("\n");
}

int main (int argc, char* argv[]) {

    unsigned char num1 = 192;
    unsigned char num2 = 168;
    int num3 = 0;
    num3 = (num1 << 8) | num2;
    printf("first number: %d\n", num1);
    print_binary(num1);

    printf("second number: %d\n", num2);
    print_binary(num2);

    printf("The number is %d\n", num3);
    print_binary(num3);

    return 0;
}
于 2016-02-19T08:59:12.783 回答
-1

这个看起来很容易理解)

 #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    using namespace std;



    int main()
    {
    int a = 32; // 100000
    int b = 5; // 101
    int step=0;
    int siz=0;
    while(1){
    if(pow(2,step) < b){
    step++;
    continue;
    }
    else{
    siz = step;
    break;
    }

    }
    a = a<<siz;
    a = a | b;
    cout<<a;
    }
于 2016-08-01T19:53:22.883 回答