2016-03-17 4 views
3

Я хочу добавить два целых числа без знака 32 бит в 1 64-битное целое число. Я пробовал этот код, но он терпит неудачу. Тем не менее, он работает на 16-битных целых чисел в 1 32 битДобавление бит в C/C++

Код:

char buffer[33]; 
char buffer2[33]; 
char buffer3[33]; 

/* 
uint16 int1 = 6535; 
uint16 int2 = 6532; 
uint32 int3; 
*/ 


uint32 int1 = 653545; 
uint32 int2 = 562425; 
uint64 int3; 

int3 = int1; 
int3 = (int3 << 32 /*(when I am doing 16 bit integers, this 32 turns into a 16)*/) | int2; 


itoa(int1, buffer, 2); 
itoa(int2, buffer2, 2); 
itoa(int3, buffer3, 2); 



std::cout << buffer << "|" << buffer2 << " = \n" << buffer3 << "\n"; 

Выход когда 16bit часть включена:

1100110000111|1100110000100 = 
11001100001110001100110000100 

выход, когда 32bit часть включена:

10011111100011101001|10001001010011111001 = 
10001001010011111001 

Почему это не работает? Спасибо

+1

Не могли бы вы опубликовать реализацию '_itoa()'? – EOF

+2

Нет языка C/C++! – Olaf

+1

@EOF _itoa() является «более безопасным» в соответствии с методом Visual Studio «itoa». Он утверждает, что он является версией C/C++, поэтому тег Olaf –

ответ

2

Try объявляя buffer3, как buffer3 [65]

Edit: Sorry. Но я не понимаю, о чем идет речь. На самом деле ответ так же, как и ожидалось. Вы можете сделать вывод из своего собственного результата для 16-битного ввода. С тех пор, как вы ведете 32 '0' бит в lsb со вторым целым, у него будут ведущие нули в msb (если они назначены 32-битовому int, который находится в сигнатуре atoi), которые усекаются в atoi (только целое значение эквивалент будет читаться в строке, поэтому строка должна быть 0X0 завершена, в противном случае она будет иметь определяемый размер), давая результат.

+0

Это должен быть комментарий, а не ответ. Хотя хорошо, что буфер слишком мал для хранения 64-битной строки, он также появляется из вывода программы (игнорируя потенциальный неопределенный аспект поведения), что 'atoi' фактически обрабатывает значение как 32-битное и, следовательно, _not_ вызывая неопределенное поведение. Это отменит ваш ответ на «просто комментарий» или «просто неправильно». – paddy

+0

Вы были правы. Мой первый ответ был неправильным. Нет смысла использовать 64-битный буфер, потому что функция имеет дело с 32-битными целыми числами. Вместо этого используйте функцию «ltoa» с 64-битным буфером. – Chews

4

Я не вижу ничего плохого в этом коде. Меня устраивает. Если есть ошибка, это код не отображается.

Версия данного кода, используя объявления стандартизованного типа и манипуляции с iostream, вместо вызовов библиотеки на платформе. Битовые операции идентичны приведенному примеру.

#include <iostream> 
#include <iomanip> 
#include <stdint.h>  

int main() 
{ 
    uint32_t int1 = 653545; 
    uint32_t int2 = 562425; 
    uint64_t int3; 

    int3 = int1; 
    int3 = (int3 << 32) | int2; 

    std::cout << std::hex << std::setw(8) << std::setfill('0') 
      << int1 << " " 
      << std::setw(8) << std::setfill('0') 
      << int2 << "=" 
      << std::setw(16) << std::setfill('0') 
      << int3 << std::endl; 
    return (0); 
} 

Результирующий выход:

0009f8e9 000894f9=0009f8e9000894f9 

Операция поразрядное выглядит правильно для меня. При работе с битами, шестнадцатеричный является более удобным. Любая ошибка, если таковая имеется, содержится в коде, который не был указан в вопросе. Что касается «добавления бит в C++», то то, что у вас есть в вашем коде, кажется правильным.

+0

Возможно, проблема с itoa? Это была одна из моих мыслей. –

+0

Это было сделано довольно давно, довольно уверенно, когда 64 бит был редкостью. Возможно, это и есть проблема.Я проведу ваш код –

+0

Возможно, но вопрос в том, что побитовые манипуляции, и это доказывает правильность побитовых манипуляций. Вполне возможно, что вопрос здесь может быть «то, что делает эта функция _itoa», но это был бы другой вопрос. –

Смежные вопросы