Да, это можно сделать. Вам необходимо зафиксировать значение и выполнить операцию. Затем вам нужно использовать атомарное сравнение и обмен (например, InterlockedCompareExchange в Windows), чтобы сохранить новое значение, если память все еще содержит старое значение. Если кто-то изменил значение, вы зациклились и попробуйте снова. Обратите внимание, что это стандартный шаблон для выполнения любой операции над частью данных размером в слово, где встроенная функция недоступна.
В приведенном ниже коде используется int - как указал Кит, вы можете использовать объединение, чтобы иметь возможность получить значения структуры как int.
int oldValue, newValue;
do
{
oldValue = myRef;
newValue = oldValue & ~AGE_MASK;
} while (InterlockedCompareExchange(&myRef, newValue, oldValue) != oldValue);