"Есть ли способ заставить массив проходить цикл без определения размера массива?"
Нет.Размеры массива фиксированы в точке, в которой объявлен массив, и размер известен: например, @ Observer
size_t size = sizeof bitStore/sizeof bitStore[0];
Вместо этого, поскольку код имеет "заданную битовую строку (до32 бита) ", определите массив как размер 32 (или 33 - это строка , необходимая).
Отслеживайте, какая часть массива была назначена.
//int bitStore[n];
int bitStore[MAX_BITS];
int count = 0;
// char bit = getchar();
int bit = getchar(); // Use `int` to account for potentially 257 different values
//while (getchar != enter) {
while (count < MAX_BITS && (bit == '0' || bit == '1')) {
bit = bit - '0';
// Do not read again, instead save result.
//scanf("%c", &bitStore[bit]);
bitStore[count++] = bit;
// getchar();
bit = getchar();
}
чтобы не использовать функции pow и умножения.
Просто добавьте или умножьте на 2 с помощью сдвига.Непонятно, почему у ОП цель не использовать «умножение».Я вижу мало причин, чтобы запретить *
.Хороший компилятор будет генерировать эффективный код, когда базовое умножение стоит дорого, так как *2
тривиально для оптимизации.
// int unsignedMag;
unsigned unsignedMag = 0; // initialize
// for (int i = 0; i < bitStore[i]; i++) {
for (int i = 0; i < count; i++) {
// preferred code, yet OP wants to avoid * for unclear reasons
// unsignedMag = unsignedMag*2 + bitStore[i];
unsignedMag = unsignedMag + unsignedMag + bitStore[i];
}
pow()
здесь хорошо избегать по многим причинам.Более того, использование double
math для целочисленной задачи приводит к проблемам с точностью с широкими целыми числами.
преобразует данную битовую строку (до 32 бит) в десятичную
Обратите внимание, что bitStore[]
массив не требуется для этой задачи.Просто введите unsignedMag
при чтении данных.