|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.04.2010, 15:13 | #1 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
побитовые операции
почему b[1] = ((a[0]<<6)|(a[1]>>2))>>2
и b[1] = ((a[0]<<6)|(a[1]>>2)); b[1] = b[1]>>2; дают разные результаты? ведь по сути одно и то же написано |
16.04.2010, 15:21 | #2 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
какой тип данных у b[] ?
Просто если b - int, то при сдвиге в право левые биты будут заполнятся единицами, что может привести к неожиданным результатам. Попробуйте оба массива сделать без знаковыми. (unsigned int, впрочем не обязательно int, смотря что вам нужно)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 16.04.2010 в 15:24. |
16.04.2010, 15:35 | #3 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
// to.cpp : Defines the entry point for the console application.
// #include "stdafx.h" #include <iostream> #include <bitset> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { unsigned char a[3]; a[0] = 103; a[1] = 193; a[2] = 58; for (int i = 0; i<=2; i++) std::cout<<"a["<<i<<"] = "<<(int)a[i]<<std::endl; unsigned char b[4]; /*b[0] = a[0]>>2; b[1] = ((a[0]<<6)|(a[1]>>2))>>2; b[2] = ((a[1]<<4)|(a[2]>>4))>>2;; //std::cout<<std::endl<<std::endl; //std::cout<<bitset<8>(b[2])<<endl; b[3] = (a[2]<<2)>>2; for (int i = 0; i<=3; i++) std::cout<<"b["<<i<<"] = "<<(int)b[i]<<std::endl;*/ cout<<bitset<8>(a[0])<<endl; b[1] = ((a[0]<<6)|(a[1]>>2)); b[1] = b[1]>>2; cout<<bitset<8>(b[1]); system("pause"); return 0; } |
16.04.2010, 16:27 | #4 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
странно результат должен быть 00011100 (28)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
16.04.2010, 18:26 | #5 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
ROD, у тебя тоже разные результаты получились?
|
16.04.2010, 19:00 | #6 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
я не проверял.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
16.04.2010, 19:11 | #7 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
При проведении побитовых операций вычисления производятся с типом int. В первом случае все операции производятся с int без потери данных, во втором случае часть операций(((a[0]<<6)|(a[1]>>2))) выполняется с int, потом результат приводится к char, при этом, во время приведения обрезаются биты, выходящие за пределы ёмкостных возможностей типа char(8 бит) и затем вновь всё это приводится к int и смещается на 2 бита вправо. Но часть бит мы уже потеряли при первом приведении к char. Собственно именно поэтому результат неверный
|
16.04.2010, 19:27 | #8 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
netrino, к стати не знал, спасибо, буду иметь ввиду.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как реализовать в турбо паскале побитовые сдвиги. | Moneo | Помощь студентам | 1 | 26.02.2010 11:21 |
Задачка, побитовые операции язык C | ToxaRUS | Помощь студентам | 0 | 05.11.2009 19:51 |
Побитовые операции | WinterLord | Общие вопросы C/C++ | 1 | 12.10.2008 22:39 |
РЕбята задали побитовые операции... | AliG | Помощь студентам | 6 | 15.03.2007 20:08 |