Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2010, 15:13   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 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;
дают разные результаты? ведь по сути одно и то же написано
Dimarik вне форума Ответить с цитированием
Старый 16.04.2010, 15:21   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

какой тип данных у b[] ?

Просто если b - int, то при сдвиге в право левые биты будут заполнятся единицами, что может привести к неожиданным результатам. Попробуйте оба массива сделать без знаковыми. (unsigned int, впрочем не обязательно int, смотря что вам нужно)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 16.04.2010 в 15:24.
ROD вне форума Ответить с цитированием
Старый 16.04.2010, 15:35   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 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;
}
Dimarik вне форума Ответить с цитированием
Старый 16.04.2010, 16:27   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

странно результат должен быть 00011100 (28)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 16.04.2010, 18:26   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ROD, у тебя тоже разные результаты получились?
Dimarik вне форума Ответить с цитированием
Старый 16.04.2010, 19:00   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

я не проверял.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 16.04.2010, 19:11   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
почему
Код:
  b[1] = ((a[0]<<6)|(a[1]>>2))>>2
и
Код:
     b[1] = ((a[0]<<6)|(a[1]>>2));
     b[1] = b[1]>>2;
дают разные результаты? ведь по сути одно и то же написано
При проведении побитовых операций вычисления производятся с типом int. В первом случае все операции производятся с int без потери данных, во втором случае часть операций(((a[0]<<6)|(a[1]>>2))) выполняется с int, потом результат приводится к char, при этом, во время приведения обрезаются биты, выходящие за пределы ёмкостных возможностей типа char(8 бит) и затем вновь всё это приводится к int и смещается на 2 бита вправо. Но часть бит мы уже потеряли при первом приведении к char. Собственно именно поэтому результат неверный
netrino вне форума Ответить с цитированием
Старый 16.04.2010, 19:27   #8
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

netrino, к стати не знал, спасибо, буду иметь ввиду.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать в турбо паскале побитовые сдвиги. 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