Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KostyaKulakov
Заблокирован
#1

Шифрация битов - C++

04.08.2012, 20:35. Просмотров 839. Ответов 8
Метки нет (Все метки)

пyтём смeны мeстaми 0-гo и 1-гo битoв, 2-гo и 3-гo, … , 30-гo и 31-гo битoв.
Фyнкция дoлжнa принимaть в кaчeствe пaрaмeтрa пeрeмeннyю типa unsigned
int и вoзврaщaть в кaчeствe рeзyльтaтa «зaшифрoвaннoe» числo тoгo же типa.
помогите решить вот такую задачу. пробывал писать коды с if не получалось. в цикле тоже не работало.
каким образом её можно решить?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2012, 20:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифрация битов (C++):

Перевод таблицы битов и времени в последовательность битов arduino - C++
доброго времени суток в приведенной ниже таблице левый столбец - биты, правый - их длительность. известно, что единичный сигнал длится от...

Шифрация - C++
Шифрация. Один из методов шифрации называется наложением гаммы. Делается это следующим образом: берется некоторое случайное число в...

Шифрация (С++) - C++
"Один из методов шифрации называется наложением гаммы. Делается это следующим образом: берется некоторое случайное число в диапазоне от 127...

Операции с побитовыми операторами (число 8 битов и число 9 битов) - C++
Доброго времени суток всем ! Прошу ответа на несложный вопрос (...по крайней мере мне так кажется...) Есть функция: ...

Перестановка битов - C++
Помогите пожалуйста в файле задание

Сброс битов - C++
Вот такое условие. "Если в числе x установлен бит n и установлен бит m, то в числе y сбросить биты 3 и самый старший бит." Логически...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
04.08.2012, 20:53 #2
Тут вариантов много разложить в массив бит или использовать std:bitset<> ...
1
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.08.2012, 21:01 #3
<3 жонглирование битами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
 
unsigned scramble(unsigned value)
{
  unsigned result = 0;
  for (unsigned mask_o = 1, mask_s = 2;
                mask_o != 0;
                mask_o <<= 2, mask_s <<= 2)
  {
    result |= ((value & mask_o) << 1) | ((value & mask_s) >> 1);
  }
  return result;
}
 
std::string asBits(unsigned value)
{
  std::string str;
  str.resize(32);
  for (int i = 31; i >= 0; --i) {
    str[i] = (value & 1) ? '1' : '0';
    value >>= 1;
  }
  return str;
}
 
int main()
{
  unsigned test = 12345678;
  std::cout << asBits(test) << std::endl;
  std::cout << asBits(scramble(test)) << std::endl;
  return 0;
}
2
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,673
Записей в блоге: 17
04.08.2012, 21:58 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bitset>
#include <iostream>
 
template <class T>
T func(const T& bits)
{
 const size_t size= sizeof(T)*8;
 std::bitset<size> b(bits);
 
 for(size_t i=0; i+1<size; i+=2)
  {
   bool temp= b[i];
   b[i]= b[i+1];
   b[i+1]=temp;
  }
 return b.to_ulong();
}
//--------------------------------------------
int main()
{
system("chcp 1251");
using namespace std;
 
unsigned n1=  5461,n2;
 
bitset<32> b1(n1); cout<<b1<<endl; // Вывод
 
n2= func(n1);
 
bitset<32> b2(n2); cout<<b2<<endl; // Вывод
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
2
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2012, 22:15 #5
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
пyтём смeны мeстaми 0-гo и 1-гo битoв, 2-гo и 3-гo, … , 30-гo и 31-гo битoв.
Фyнкция дoлжнa принимaть в кaчeствe пaрaмeтрa пeрeмeннyю типa unsigned
int и вoзврaщaть в кaчeствe рeзyльтaтa «зaшифрoвaннoe» числo тoгo же типa.
помогите решить вот такую задачу. пробывал писать коды с if не получалось. в цикле тоже не работало.
каким образом её можно решить?
Вот вариант с представлениями битов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;
 
//Получает массив двоичного представления числа val
int * getBinArray(int val, int &n);
//Функция возвращает зашифрованній массив
int * getCrypt(int * bin, int n);
//Функция преобразует массив двоичного представления в десятичное
int getDecValue(int * c, int nc);
//Функция печатает на экране элементы одномерного массива
void showVec(int * vec, int n);
 
int main()
{
    int n   = 0;//будет содержать число бит в числе
    int val = 0;//вводимое десятичное число
    cout<<"Dec = ";cin>>val;
    int * bin  = getBinArray(val, n);
    cout<<"Bin = ";  showVec(bin, n);
    bin = getCrypt(bin, n);//щифруем
    cout<<"Enc = ";  showVec(bin, n);
    cout<<"Dec = "<<getDecValue(bin, n)<<endl;
    delete [] bin;
    return 0;
}
 
int * getBinArray(int val, int &n)
{
    n       = 1;
    int buf = val;
    while(buf /= 2)
        n = n + 1;
    int * arr = new int[n];
    for(int i = 0; i < n; i++)
    {
        arr[n - 1 - i] = val % 2;
        val            = val / 2;
    }
    return arr;
}
 
int * getCrypt(int * bin, int n)
{
    for(int i = 0; i + 2 < n; i += 2)
        swap(bin[n - 1 - i],bin[n - 2 - i]);//Меняем местами биты
    return bin;
}
 
int getDecValue(int * bin, int n)
{
    int val = 0;
    int pwr = 1;
    for(int i = 0; i < n; i++)
    {
        val += bin[n - 1 - i]*pwr;
        pwr *= 2;
    }
    return val;
}
 
void showVec(int * vec, int n)
{
    for(int i = 0; i < n; i++)
        cout<<vec[i]<<" ";
    cout<<endl;
}
Писал быстро и тестил всего пару раз, но думаю всё ок
1
Миниатюры
Шифрация битов  
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
04.08.2012, 22:51 #6
KostyaKulakov,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <bitset>
 
static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
                            8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
 
unsigned int NumberOfBits(unsigned int number){
    number |= number >> 1;
    number |= number >> 2;
    number |= number >> 4;
    number |= number >> 8;
    number |= number >> 16;
 
    return table[(unsigned int)(number * 0x07C4ACDDU) >> 27] + 1;
}
 
unsigned int EncryptingNumber(unsigned int number) {
   std::size_t number_bits = NumberOfBits(number);
   for (std::size_t i = 0; i < number_bits - 1; i +=2) {
      if ((number >> i ^ number >> i + 1) & 1) {
         number ^= 1 << i | 1 << i + 1;
      }
   }
   
   return number;
}
 
int main() {
   unsigned int number = 1521214;
   std::cout << EncryptingNumber(number) << std::endl;
}
http://liveworkspace.org/code/bc0951...d6e29ad344a2fc

Вообще рекомендую книжку Генри Уоррена. В ней излагаются интересные приемы для работы с отдельными битами..
2
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.08.2012, 00:28 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Кстати, на меня внезапно снизошло озарение, что циклы не нужны. Пожалуй, быстрее некуда.
C
1
2
3
4
5
6
7
#define EVEN_BITS_MASK 0xAAAAAAAAU
#define ODD_BITS_MASK  0x55555555U
 
unsigned scramble(unsigned value)
{
  return ((value & EVEN_BIT_MASK) >> 1) | ((value & ODD_BITS_MASK) << 1);
}
Добавлено через 47 минут

Не по теме:

Я не мог упустить эту возможность. Теперь на 146% переносимее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <string>
 
template<unsigned accum = 0U, unsigned iter = 1U, size_t bit_count_iter = 0>
struct UINT_BIT_MASK {
  static const unsigned odd = UINT_BIT_MASK<accum | iter, iter << 2>::odd;
  static const unsigned even = UINT_BIT_MASK<accum, iter>::odd << 1;
  static const size_t bit_count = UINT_BIT_MASK<accum, iter << 1, bit_count_iter + 1>::bit_count;
};
 
template<unsigned accum, size_t bit_count_iter>
struct UINT_BIT_MASK<accum, 0U, bit_count_iter> {
  static const unsigned odd = accum;
  static const unsigned even = accum << 1;
  static const size_t bit_count = bit_count_iter;
};
 
typedef UINT_BIT_MASK<> uint_bit_mask;
 
unsigned scramble(unsigned value)
{
  return ((value & uint_bit_mask::even) >> 1) | ((value & uint_bit_mask::odd) << 1);
}
 
std::string asBits(unsigned value)
{
  std::string str;
  str.resize(uint_bit_mask::bit_count);
  for (int i = uint_bit_mask::bit_count - 1; i >= 0; --i) {
    str[i] = (value & 1) ? '1' : '0';
    value >>= 1;
  }
  return str;
}
 
int main()
{
  unsigned test = uint_bit_mask::even;
  std::cout << asBits(test) << std::endl;
  std::cout << asBits(scramble(test)) << std::endl;
  return 0;
}
4
KostyaKulakov
Заблокирован
05.08.2012, 10:26  [ТС] #8
ребят это всё хорошо. но можно же декрементировать вот эту функцию и в ней сделать шифрацию или нет?
C++
1
2
3
4
5
6
7
8
9
10
11
void ss(unsigned int x)
{
    for (int i = sizeof(unsigned int)*8 - 1; i >= 0; i--)
    {
        unsigned int mask = (1 << i);
        if (x & mask)
            cout << '1';
        else
            cout << '0';
    }
}
мне вот такая нужна функция только чтобы она шифровала

Добавлено через 36 минут
переписал получилось вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void scramble(unsigned value)
{
  unsigned value = 0;
 
  for (unsigned mask_o = 1, mask_s = 2;
                mask_o != 0;
                mask_o <<= 2, mask_s <<= 2)
  {
    value |= ((value & mask_o) << 1) | ((value & mask_s) >> 1);
  }
      for (int i = 31; i >= 0; --i)
      {
          unsigned int mask = (1 << i);
            if (value & mask) 
                cout << '1';
                else
                cout << '0';
      }
}
Добавлено через 1 час 27 минут
всё сделал. вот такой код получился
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
using namespace std;
 
void scramble(unsigned x)
{
  unsigned value = 0;
 
  for (unsigned mask_o = 1, mask_s = 2;
                mask_o != 0;
                mask_o <<= 2, mask_s <<= 2)
  {
    value |= ((x & mask_o) << 1) | ((x & mask_s) >> 1);
  }
      for (int i = 31; i >= 0; --i)
      {
          unsigned int mask = (1 << i);
            if (value & mask) 
                cout << '1';
                else
                cout << '0';
      }
}
 
void printAsBinary(unsigned value)
{
  for (int i = 31; i >= 0; --i)
  {
      unsigned int mask = (1 << i);
        if (value & mask) 
            cout << '1';
            else
            cout << '0';
  }
}
 
int main()
{
  unsigned a = 0;
  cout << "Enter the number of: ";
  cin >> a;
cout << endl << "number of bits: " << endl;
  printAsBinary(a);
  cout << endl << "number of bits in the encrypted: " << endl;
 
  scramble(a);
 
  cout << endl << endl;
  return 0;
}
0
lupus1libertas
3 / 3 / 0
Регистрация: 27.07.2012
Сообщений: 19
05.08.2012, 17:02 #9
лишнее сообщение
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 17:02
Привет! Вот еще темы с ответами:

Замена битов - C++
Помогите решить задачу, пожалуйста. Ввести последовательность из 8 символов. Если символ есть + - * / %, то заменить в нём четыре младших...

Поля битов - C++
Не могу разобраться в полях. Пытаюсь создать структуру полей битов для хранения даты какого-нибудь события. Две функции: 1-я устанавливает...

Установка битов - C++
Установка битов Для этого надо сложить операцией «ИЛИ» x с маской, у которой единицы в соответствующих позициях. Например, чтобы...

Копирование битов - C++
Задача: Вот ее решение: int copy_bits( int A, int B, int startBit, int stopBit) //Post 999 { /* Биты считаем с нулевого,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.08.2012, 17:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru