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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2012, 18:20   #1
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию Поразрядные операции

Дано long-число L = ABCDEFGH, где AB…GH – 16-ричные цифры. Определить в числе L комбинацию битов (число), располагающееся слева от числа CD&EG, если такое число есть в L.

не проверяет условие if, а сразу пишет, что нет такого числа

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{ long L, CD, E, G, EG, N, X, M;
int i, m;
printf("Vvedite L:");
scanf("%X", &L);
CD=L<<8>>24;
E=L<<16>>28;
G=L<<24>>28;
EG=(E<<4)|G;
N=CD&EG;
for(i=0; i<=32; i++)
{X=(L>>i) & N;
if(X==N)
{break;}
else
{printf("Takogo chisla net");
goto m;}}
M=(L>>i)>>4;
printf("X=%X i=%d M=%X", X, i, M);


m: getch();
        return 0;
}
Sv. вне форума Ответить с цитированием
Старый 07.11.2012, 18:30   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Вы же проверяете на каждой итерации. Облом на первой итерации => сразу выход. Отладчик показал бы эту проблему сразу.
CD у Вас немного странно вылавливается, традиционно всё-таки так:
Код:
CD = (L & 0x00FF0000) >> 16;
И проверка некорректна: 0xFF & 0x4C равно 0x4C.
Abstraction вне форума Ответить с цитированием
Старый 07.11.2012, 19:04   #3
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Цитата:
0xFF & 0x4C равно 0x4C.
не могу понять, что здесь происходит?
Sv. вне форума Ответить с цитированием
Старый 07.11.2012, 19:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Здесь применяется битовая операция AND. Она оставляет в первом числе биты со значением 1, которые во втором числе на том же месте имеют единицы. Остальные биты обнуляются, тем самым получая новое число - 0x4C в 16-тиричной нотации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2012, 19:34   #5
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

я не понимаю, как определять, что именно нужно писать на месте FF или 4С...

в моем случае надо написать: if(0xFF&X==N)?

Последний раз редактировалось Sv.; 07.11.2012 в 19:51.
Sv. вне форума Ответить с цитированием
Старый 07.11.2012, 22:36   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Отладчик. Возьмите, примените, посмотрите, чему становится равно X, в каких случаях срабатывает (при разных числах) условие и т.д.
Abstraction вне форума Ответить с цитированием
Старый 08.11.2012, 22:16   #7
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
long chislo(long, long, long, long, long, long);
void main()
{long L, Z, N, CD, E, G, EG, M;
int i;
printf("Vvedite L:");
scanf("%X", &L);
Z=chislo(N, CD, E, G, EG, L);
printf("Z=%X", Z);


for(i=1;i<=32;i++)
{if(((L>>i)&Z)==Z)
M=(L>>i)>>Z;
break;}
printf("\n i=%d \n M=%X", i, M);
getch();
}

long chislo(long N, long CD, long E, long G, long EG, long L)
{
CD=(L&0x00FF0000)>>16;
E=(L&0x0000F000)>>12;
G=(L&0x000000F0)>>4;
EG=(E<<4)|G;
N=CD&EG;
return N;
}
помогите пожалуйста, как записать, чтобы выводил числа, стоящие левее Z. Как у меня есть не всегда правильно выводит..
и в цикле нужно от 0 до 32 или от 1 до 32?

Последний раз редактировалось Sv.; 08.11.2012 в 22:26.
Sv. вне форума Ответить с цитированием
Старый 09.11.2012, 00:15   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Обратите внимание, что Вашей функции chislo реально нужно только значение L. Все прочие переменные можно сделать локальными и не таскать их повсюду:
Код:
long chislo(long L)
{
long N, CD, E, G, EG; 
CD=(L&0x00FF0000)>>16;
E=(L&0x0000F000)>>12;
G=(L&0x000000F0)>>4;
EG=(E<<4)|G;
N=CD&EG;
return N;
}
Теперь по поводу второй части основной функции. Нам нужно раз за разом "вырывать" из L последовательность в 8 бит и проверять её на равенство Z. Как всегда, если задача почему-то не решается целиком, её можно разбить на куски. Вот пример функции, которая принимает L и смещение i и возвращает число, соответствующее 8 битам в L, самый левый из которых отстоит на i от левого края L (то есть, при i==0 эта функция вернёт число, располагающееся в крайних левых 8 битах, а при i==24 - в крайних правых):
Код:
int BitBlock(long L, int i){
  long mask = 0xFF000000 >> i;//Маска, выделяющая нужные нам 8 бит
  long masked = L&mask;
  return masked>>(24-i);//mask и masked суммарно сдвинулись на 24
}
Условие в основной функции теперь принимает вид:
Код:
int main(void)
{
  long L, M, Z;
  int i;
  printf("Vvedite L:");
  scanf("%X", &L);
  Z=chislo(L);
  printf("Z=%X", Z);


  for(i=0; i<=24; i++)//Есть всего 25 способов разместить блок из 8 бит в 32-битном числе!
  {
    if(BitBlock(L,i)==Z){//Кто будет ставить скобки? Пушкин?
      //M=(L>>i)>>Z;
      //Нет, не так. Посмотрите на функцию BitBlock и мыслите по аналогии. Нарисуйте число на бумажке.
      break;
    }
  }
  printf("\n i=%d \n M=%X", i, M);
  getch();
  return 0;//Правила хорошего тона: main должно возвращать int; при успешном завершении программы это должен быть 0
}
Abstraction вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операции с Form. Євгеній Бєлік Помощь студентам 2 13.11.2011 15:31
Логические и поразрядные операции prem1era Общие вопросы C/C++ 2 25.03.2011 14:40
Поразрядные операции Максикок Помощь студентам 1 18.11.2010 20:23
C#: операции с матрицами Sianessa Помощь студентам 12 13.05.2009 22:22
Поразрядные операции eds Общие вопросы C/C++ 1 30.10.2008 10:29