C/C++

Всем здарово! Пожалуйста помогите! Кому несложно очень прошу!

Нужно сделать контрольный пример кода

#include "cstdio"
using namespace std;
int main() {
const int n = 10;
short int A[n];
for (int i = 0; i < n; ++i) {
*(((char*)(&A[2*i])) + 1) = (char)(i);
*((char*)(&A[2+i])) = (char)(i);
printf("%d ", A[2*i]);
}
printf("\n");

int sum = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 15; ++j) {
short int mask = 1;
if (((A[i] & (mask << j)) >> j) == 1) {
++sum;
}
}
}
printf("%d\n", sum);

}
   Максим, неужели в Казани так плохо преподают алгоритмизацию и программирование??? Ведь Вы даже не представили целостного условия задания (а по разрозненным скриншотам можно только догадываться).
   Да и с кодом Вы нагородили массу лишнего. Посмотрите ещё раз на словесный алгоритм, почему бы не сделать, как написано?

   Вот формула для инициализации массива:
for (int i = 0; i < n; ++i) A[i] = (min + rand()%(1 + max - min)) & 0x5555;

Эта формула учитывает не только генерацию псевдослучайных чисел из диапазона [min, max], но и наложение маски 0x5555.

   Для того, чтобы использовать функцию rand() следует в начало кода добавить строку #include <cstdlib>

   По формуле сначала вычисляются: 1) 1 + max - min — это ширина диапазона [min, max], 2) значение функции rand(). Далее второе делится на первое и извлекается остаток от деления. Этот остаток прибавляется к min, таким образом гарантируется, что результат будет принадлежать диапазону. И, наконец, с помощью конъюнкции на результат накладывается маска 0x5555. Вот и всё!!!

   Представленная формула не оптимальна, т. к. в цикле каждый раз вычисляется одна и та же ширина диапазона!!! Гораздо лучше вычислить ширину диапазона один раз и присвоить временной переменной, а в цикле брать значение этой переменной.

   Для наглядности можно объявить именованную константу со значением 0x5555.
Александр Попов
Александр Попов
16 172
Лучший ответ
Александр Попов // Функция инициализации массива

void Init_array(short int * A, int n, int min, int max)
{
const int Mask = 0x5555;
int width = 1 + max - min;
for (int i = 0; i < n; ++i) A[i] = (min + rand()%width) & Mask;
}
Александр Попов Пожалуйста, выложите полный текст задания!
Александр Попов Для поиска в массиве первого элемента, k-й бит которого равен 1, можно воспользоваться другой маской:

int Mask_K = 1 << k; // учитывается факт, что нумерация бит начинается с 0

Путём перебора всех элементов массива найти элемент, наложение на который маски Mask_K даст в результате ту же маску. Условие: A[i] & Mask_K == Mask_K
Бери генератор случайных чисел А и В прогони, потом бери сайт с делением в столбик и там прогони эти числа.
Alewa Глушко
Alewa Глушко
4 210