Эффективный подход заключается в использовании ассоциативных массивов bash 4.0:
#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Requires bash 4.0+" >&2; exit 1;; esac
declare -A input_fields_list=( [one]=1 [two]=1 [three]=1 [four]=1 [five]=1 )
declare -A req_fields_list=( [one]=1 [six]=1 [seven]=1 [eight]=1 )
declare -A non_input_fields_list=( [two]=1 [three]=1 [seven]=1 [eight]=1 [nine]=1 )
for xfr in "${!input_fields_list[@]}"; do
[[ ${req_fields_list[$xfr]} ]] && continue
[[ ${non_input_fields_list[$xfr]} ]] && continue
echo "$xfr not found" >&2
exit 1
done
echo "All input fields are valid" >&2
exit 0
Как вы можете видеть на https://ideone.com/IhmVKy , это правильно завершается с five not found
.
C# (скорее.NET) также использует дополнение two, но это поддерживает и подписанные и неподписанные типы (который Java не делает). Немного маски является более естественно неподписанной вещью - почему один бит должен отличаться, чем все другие биты?
В этом конкретном случае безопасно использовать бросок непроверенный:
int ALPHA_MASK = unchecked((int)0xFF000000);
Чтобы "непосредственно" представить это число как значение со знаком Вы пишете
int ALPHA_MASK = -0x1000000; // == -16777216
Шестнадцатеричный не (или не должен) несколько отличаться от десятичного числа: для представления отрицательного числа необходимо записать знак минус, сопровождаемый цифрами, представляющими абсолютное значение.
Ну, можно использовать блок непроверенный и бросок:
unchecked
{
int ALPHA_MASK = (int)0xff000000;
}
или
int ALPHA_MASK = unchecked((int)0xff000000);
Не ужасно удобный, хотя..., возможно, просто используют литеральное целое число?
И, чтобы добавить оскорбления к травме, это тоже сработает:
-0x7F000000