Некоторые компиляторы имеют 128-битные целые числа. Я использовал __uint128_t в коде, который был скомпилирован с использованием gcc на архитектуре AMD64.
Если вы используете компилятор с 128-битными целыми числами, вы можете просто повторно использовать существующий код, поскольку он не делает никаких предположений о размере слова.
Если вам нужно выполнить расчет с меньшим размером слова, он, естественно, усложняется, но не очень. Первый запуск указателя Уст масок, чтобы найти первое слово с нулевым битом (например):
for (i = 0; i < 4 && netmask[i] != 0xffffffff; ++i)
Далее вы можете применить свой оригинальный тест на netmask[i]
, наконец, вам нужно проверить, что все оставшиеся слова равны нулю.
Другой подход, чтобы применить оригинальный тест к каждому отдельному слову и, кроме того теста, что каждая пара слов имеет первую быть все те или второй все нули:
int contiguous(uint32_t **netmask)
{
int i;
for (i = 0; i < 4; ++i) {
if ((~netmask[i] + 1) & (~netmask[i])) return 0;
}
for (i = 0; i < 3; ++i) {
if ((netmask[i] != 0xffffffff) && (netmask[i+1] != 0)) return 0;
}
return 1;
}
Вы также можете взять более общий подход и не принимать маску в качестве входных данных, а вместо этого использовать длину префикса, указанную как целое число в диапазоне от 0 до 128 в качестве входного. Затем вы можете сами создать битмаску и знать, что она смежна.
Как вы храните маску? – chepner
'~ netmask + 1' совпадает с' -netmask' в дополнении 2, так почему бы вам не использовать его? Это короче –
@chepner маску, хранящуюся в структуре in6_addr. – evelina