Добрый день!
Следующая программа делает то, что вам нужно:
fn main() {
const SIZE: usize = 8;
let bits_in: [bool; SIZE] = [true, true, false, false, false, false, true, false];
let result = bits_in.iter() // итератор элементов &bool
.enumerate() // итератор элементов (usize, &bool), где первое число - индекс
.fold(0, |acc, (n, &b)| acc + if b { 1 << n } else { 0 });
println!("{}", result);
}
Кстати, вы в курсе, что в вашей программе ошибка выхода за границы массива?
> for (ri = 0; ri <= SIZE; ri++)
> if (bitsin[ri]==1)
Здесь цикл от 0 до SIZE включительно по массиву размера SIZE; последний индекс будет указывать за границу массива.
Код на Rust выше использует итераторы; но то же самое можно сделать и обычным циклом:
fn main() {
const SIZE: usize = 8;
let bits_in: [bool; SIZE] = [true, true, false, false, false, false, true, false];
let mut result = 0;
for (n, &b) in bits_in.iter().enumerate() {
if b {
result |= 1 << n;
}
}
println!("{}", result);
}
Или даже так:
fn main() {
const SIZE: usize = 8;
let bits_in: [bool; SIZE] = [true, true, false, false, false, false, true, false];
let mut result = 0;
for n in 0..SIZE {
if bits_in[n] {
result |= 1 << n;
}
}
println!("{}", result);
}
Но вариант с итераторами (самый первый) более идиоматичный. Кроме того, при проходе по итератору нет проверок выхода за границы массива при получении каждого элемента - это скрыто в самих итераторах. С доступом по индексу проверка выхода индекса за границы будет делаться всегда, хотя в данном случае очень вероятно, что в --release-режиме LLVM её выкинет.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/rust-russian/e6c0b9f5-e8de-4d48-8c05-1db6f13ff8fa%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
https://groups.google.com/d/optout.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/rust-russian/e6c0b9f5-e8de-4d48-8c05-1db6f13ff8fa%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
https://groups.google.com/d/optout.