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

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

Войти
Регистрация
Восстановить пароль
 
case
7 / 7 / 2
Регистрация: 29.09.2010
Сообщений: 32
#1

побитовые операции, не могу разобраться - C++

12.03.2013, 02:17. Просмотров 314. Ответов 2
Метки нет (Все метки)

Есть такой псевдокод


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
var int[0..623] MT // состояние генератора (тип данных int должен быть 32-битным, беззнаковому)
var int index = 0
/ / Начальная инициализация - заполнение массива состояния генератора
function initialiseGenerator ( int seed ) {
MT[0] := seed
for i from 1 to 623 {
MT[i] := 1812433253 * (MT[i-1] bitwise_xor right_shift_by_30_bits(MT[i-1])) + i
}
}
/ / Выбрать очередное ПВЧ - целое, 32 битное, беззнаковое, в интервале [0, 2 ^ 32)
function extractNumber() {
if index >= 624 {
generateNumbers()
index = 0
}
int y := MT[index]
y := y bitwise_xor (right_shift_by_11_bits(y))
y := y bitwise_xor (left_shift_by_7_bits(y) bitwise_and (2636928640))
y := y bitwise_xor (left_shift_by_15_bits(y) bitwise_and (4022730752))
y := y bitwise_xor (right_shift_by_18_bits(y))
index = index + 1
return y
}
/ / Изменить положение - возмущения массива MT - генерация следующих 624 чисел
function generateNumbers() {
for i from 0 to 623 {
int y := 32nd_bit_of(MT[i]) + last_31bits_of(MT[(i+1)%624])
if y even {
MT[i] := MT[(i+397)%624] bitwise_xor (right_shift_by_1_bit(y))
} else { // if y odd
MT[i] := MT[(i+397)%624] bitwise_xor (right_shift_by_1_bit(y)) bitwise_xor 2567483615
}
}
}
здесь last_XXbits_of – младшие XX битов числа, bitwise_xor – побитно умножения по модулю 2, right_shift_by_XX_bits –
побитно сдвиг вправо на XX битов, left_shift_by_XX_bits – побитно сдвиг влево на XX битов, 32nd_bit_of – 32 и бит (старший, бит остается на своей 32 и позиции), even – признак четности (младший бит = 0), odd – признак нечетности (младший бит = 1).



Нужно написать на С + +. Не Могу понять как реализовать

int y := 32nd_bit_of(MT[i]) + last_31bits_of(MT[(i+1)%624])


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
#define n 624
 
using namespace std;
 
 
 
int MT[n];
int seed=4727;
int index=0;
 
void initialiseGenerator()
{
    MT[0]=seed;
    for(int i=1; i<n; i++)
            MT[i] = 1812433253 *(MT[i-1]^MT[i-1]>>30) + i;
}
 
 
int extractNumber() 
    {
    if (index >= n) 
        {
            generateNumbers();
            index = 0;
        }
    int y = MT[index];
    y = y ^ (y>>11);
    y = y ^ (y<<7&2636928640);
    y = y ^ (y<<15&4022730752);
    y = y ^ (y>>18);
    index++;
    return y;
    }
// Изменить положение - возмущения массива MT - генерация следующих 624 чисел
 
void generateNumbers() 
    {
    for(int i = 0; i < n; i++)  
        {
//вот тут не могу понять как это реализовать
        int y = 32nd_bit_of(MT[i]) + last_31bits_of(MT[(i+1)%n]);
//
        if ((y&1)==0) 
            {
            MT[i] = MT[(i+397)%n]^(y>>1);
            } 
            else 
            { // if y odd
                MT[i] = MT[(i+397)%n]^(y>>1)^2567483615;
            }
        }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2013, 02:17     побитовые операции, не могу разобраться
Посмотрите здесь:

C++ Побитовые операции
C++ Побитовые операции
C++ Побитовые операции
Побитовые операции C++
C++ Побитовые операции
C++ Задача на побитовые операции
Побитовые операции C++
C++ Побитовые операции
C++ Побитовые операции
Побитовые операции |, &, >> C++
C++ Побитовые операции
Побитовые операции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
srg_btl
34 / 34 / 2
Регистрация: 21.02.2013
Сообщений: 90
12.03.2013, 13:02     побитовые операции, не могу разобраться #2
32nd_bit_of - это должен возвращать старшый бит? Тогда
C++
1
2
int k = 3065667285; // 10110110101110100101111011010101
k &= 0x80000000; // тогда у нас останеться только старшый бит
Если тебе нужно узнать какой из старших битов установлен в 1 то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef unsigned long ULI;
ULI ShowHighBit(ULI number) 
{               
    number |= (number>>1);
    number |= (number>>2);
    number |= (number>>4);
    number |= (number>>8);
    number |= (number>>16);
 
    number &= ~(number>>1);
 
    return number;
}
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
12.03.2013, 13:21     побитовые операции, не могу разобраться #3
Цитата Сообщение от case Посмотреть сообщение
Нужно написать на С + +. Не Могу понять как реализовать
int y := 32nd_bit_of(MT[i]) + last_31bits_of(MT[(i+1)%624])
а можно написать универсальные функции:
C++
1
2
3
4
5
6
7
8
9
#define BITS_IN_INT 32 //Мы не знаем битность int'а в общем случае. Не моя задача сейчас выяснять.
int nd_bit_of(int bit_number,int in){
return in&(1<<bit_number)>>bit_number;//биты нумеруются с нуля в этой функции. Можно изменить по желанию
//Если надо оставить бит, где он был, то убрать >>bit_number
}
int last_bits_of(int amout_of_bits,int in){
return (   in&( (~0)<< (BITS_IN_INT-amount_of_bits) )   ) >> (BITS_IN_INT-amount_of_bits);//Здесь amount_of_bits это сколько последних бит останется.
//Аналогично, если надо оставить биты, где они были, то убрать >> (BITS_IN_INT-amount_of_bits)
}
А можно всегда взять обычный программистский калькулятор, посмотреть какие HEX числа занимают нужные биты и сделать & с ними как в ответе выше. Из серии извращений - выписать в дефайны все хекс числа битов до 64 битов.
Yandex
Объявления
12.03.2013, 13:21     побитовые операции, не могу разобраться
Ответ Создать тему
Опции темы

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