![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#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; дают разные результаты? ведь по сути одно и то же написано |
![]() |
![]() |
![]() |
#2 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
какой тип данных у b[] ?
Просто если b - int, то при сдвиге в право левые биты будут заполнятся единицами, что может привести к неожиданным результатам. Попробуйте оба массива сделать без знаковыми. (unsigned int, впрочем не обязательно int, смотря что вам нужно)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 16.04.2010 в 15:24. |
![]() |
![]() |
![]() |
#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; } |
![]() |
![]() |
![]() |
#4 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
странно результат должен быть 00011100 (28)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
![]()
ROD, у тебя тоже разные результаты получились?
|
![]() |
![]() |
![]() |
#6 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
я не проверял.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
При проведении побитовых операций вычисления производятся с типом int. В первом случае все операции производятся с int без потери данных, во втором случае часть операций(((a[0]<<6)|(a[1]>>2))) выполняется с int, потом результат приводится к char, при этом, во время приведения обрезаются биты, выходящие за пределы ёмкостных возможностей типа char(8 бит) и затем вновь всё это приводится к int и смещается на 2 бита вправо. Но часть бит мы уже потеряли при первом приведении к char. Собственно именно поэтому результат неверный
|
![]() |
![]() |
![]() |
#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 |