Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарные опирации в С++, Помогите плз с программой 
:(
    Опции темы
NastYoNa
  Дата 28.2.2011, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



using namespace std;
const int leng = 1000;

void LRR (unsigned char *S, int p, unsigned char *F, int m, unsigned char *L, int k)
{
    unsigned char u1 = S[p]&1, u2;
    int i, j;
    for (i = 0; i < k; i++) {
        u2 = (S[p]>>F[0])&1;    // Сумма по мод. 2 элеметов при степенях с ненулевым коэф. из F
        for (j = 1; j < m; j++)
            u2^= (S[p]>>F[i])&1;
/* 1 */    L[i/8]>>(i%8) = u1;    // Запись в массив ЛРР L самый правый элемент ключа
        for (i = 0; i < 7; i++) {    // Сдвигаем ряд
            S[p]>>i = S[p]>>(i+1);
        }
/* 2 */    S[p]>>7 = u2;   // Самому левому элементы присваиваем сумму по мод. 2
    }

}

int main()
{ 
  unsigned char *S = new unsigned char[leng];
  unsigned char *F = new unsigned char[leng];
  unsigned char *Lr = new unsigned char[leng];
  srand(time(NULL));
  int i;
  int N = 8;
  for (i = 0; i < N; i++)
      S[i] = rand()%(0x100+1);
  
  return 0;

}
Вопрос, собственно по функции LRR  Но для наглядности приведу код.  Программа не хочет компилироваться, выдает такую вот ошибку (см. ниже)  к выделенным строчкам. Что это такое и как его исправить, подскажите пожалуйта!!

ОШИБКА: 
IntelliSense: выражение должно быть допустимым для изменения левосторонним значением

PM MAIL   Вверх
baldina
Дата 28.2.2011, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



кнопочкой "Код" надо пользоваться

Цитата

S[p]>>i

Код

S[p]>>7

вот эти выражения не являются lvalue, т.е. им нельзя присваивать значения. 
видимо вместо S[p]>>7=u2 должно быть 
Код

S[p] |= u2 << 7;

?
PM MAIL   Вверх
NastYoNa
Дата 28.2.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



Спасибо за ответ, остается еще кое-что.

Цитата

вот эти выражения не являются lvalue, т.е. им нельзя присваивать значения. 
видимо вместо S[p]>>7=u2 должно быть 
Выделить всёкод C++
1:    
S[p] |= u2 << 7;


Может я чего-то не понимаю, но такой записью, вроде,  S[p] |= u2 << 7;  заменять нельзя, т. к. если изначально, допустим S[p]>>7 принимало зачение 1 , а мы хотим его на 0 заменить (т.е. u2 = 0), то S[p] |= u2 << 7; присвоит значение опять 1 , т.к. 1|0 = 1 !!! (
PM MAIL   Вверх
baldina
Дата 28.2.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



верно. если нужно установить i-й бит переменной A в значение B, то
Код

A &= ~(1<<i); // снять бит
A |= B<<i;       // установить (если требуется)

можно написать функцию
Код

int setBit (int value, int index, bool is_set)
{
   return is_set ? value | (1<<index) : value & ~(1<<index);
}

использовать так:
Код

S[p] = setBit (S[p], 7, u2);


Это сообщение отредактировал(а) baldina - 28.2.2011, 19:59
PM MAIL   Вверх
baldina
Дата 28.2.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



в первом выражении ошибся. поправил
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.