Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Бинарные опирации в С++


Автор: NastYoNa 28.2.2011, 18:46
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: выражение должно быть допустимым для изменения левосторонним значением

Автор: baldina 28.2.2011, 18:52
кнопочкой "Код" надо пользоваться

Цитата

S[p]>>i

Код

S[p]>>7

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

S[p] |= u2 << 7;

?

Автор: NastYoNa 28.2.2011, 19:28
Спасибо за ответ, остается еще кое-что.

Цитата

вот эти выражения не являются 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 !!! (

Автор: baldina 28.2.2011, 19:41
верно. если нужно установить 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
в первом выражении ошибся. поправил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)