Вы должны войти, чтобы создавать сообщения и темы.

Побитовые операции & и ~ при установке атрибута файла

Добрый день, помогите пожалуйста разобраться, нашёл на форуме код для быстрого удаления папок:

public static void EmptyFolder(string[] array, string mask)
{
    foreach (string x in array)
    {
        if (Directory.Exists(x))
        {
            try
            {
                Directory.GetFiles(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
                {
                    try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }
                    try { File.Delete(y); } catch { }
                });
                Directory.GetDirectories(x, mask, SearchOption.AllDirectories).AsParallel().ForAll(y =>
                {
                    try { Directory.Delete(y, true); } catch { }
                });
            }
            catch { }
        }
    }
}

Интересует меня конкретная строчка:

try { File.SetAttributes(y, File.GetAttributes(y) & ~FileAttributes.ReadOnly); } catch { }

Хочу понять зачем в ней используются побитовые операции & и ~.

Мои расчеты такие:
FileAttributes.ReadOnly имеет интовое значение 1, кторое при применении оператора ~ превращаеться в -2.
Если файл имеет атрибут "Только для чтения", то метод File.GetAttributes(y) вернёт 1.
Далее, при использовании & между 1 и -2 получаем 0.

Тут я запутался, почему 0?
На сколько я понял, цель – снять атрибут "Только для чтения", в таком случае:
Для чего вообще нужны все эти расчётны, не быстрее ли будет всегда передавать 0 в File.SetAttributes()? Также в File.SetAttributes можно передать FileAttributes.Normal, ведь в таком случае атрибут "Только для чтения" также убирается.

Вопросов много, а ответы найти не получаеться, прошу знающих людей обьяснить устройство этого хитрого механизма.