простой и универсальный способ будет использовать такую функцию:
void *memxor(void *p, int val, size_t size) {
unsigned char *pb = p;
while (size-- > 0) *pb++ ^= (unsigned char)val;
return p;
}
и использовать его таким образом:
sample_struct s;
...
memxor(&s, ~0, sizeof s);
Если для по какой-то причине вы хотите оптимизировать больше, попробуйте это:
void meminvert(void *ptr, size_t size) {
if (((uinptr_t)ptr | size) & (sizeof(unsigned int) - 1)) {
unsigned char *p = ptr, *pe = pb + size;
while (p < pe) *p++ ^= ~0U;
} else {
unsigned int *p = ptr, *pe = p + size/sizeof *p;
while (p < pe) *p++ ^= ~0U;
}
}
Вы можете попробовать и сравнить, если на оптимизированная версия на самом деле имеет значение. Это потребует как огромной структуры, так и необоснованного количества вызовов. Подобная оптимизация редко необходима и часто ошибочна.
В ролях к INT [], где размер массива определяется SizeOf (sample_struct)/SizeOf (INT), затем цикл над ним и использовать ~ operator? Может быть, вам нужно будет более конкретно говорить об «эффективном». – BadZen
Можете ли вы привести пример: какие значения до и после инверсии? –
Значение понятное - все биты в памяти, соответствующие полям структуры, должны быть перевернуты. – BadZen