Бенуа в значительной степени сказал это. Один - это дополнение, все, кроме этих битов, другой - только эти биты.
something&=~3;
Часто означает, что вы сосредотачиваетесь на этих двух битах, а 0xFC - на других битах. версия ~ отображается непосредственно на немного понятную инструкцию на некоторых платформах, которая, возможно, заставляет автора чувствовать себя лучше, написав ее таким образом. И версия ~ менее подвержена ошибкам и ошибкам, если вы измените размер переменной (не перемещая эти два бита), ваш код все еще будет работать, при использовании 0xFC код будет поврежден, и его нужно касаться везде, где используется переменная. (использование #define для скрытия константы ухудшает отладку. Может быть, лучше, если определение будет использоваться повторно, но ущерб уже нанесен).
В конце концов, это такая же стильная вещь, как
if(!(x&something) {
vs
if((x&something)==0) {
vs
if(x&something) ; else {
На уроках рисования или рисования вас, вероятно, научат сосредотачиваться на негативе, на фоне, рисовать не контур объекта, а контур того, что не является объектом.
В колледже (электротехнике, по крайней мере, десятилетия назад до появления компьютерной инженерии) нас поощряли мыслить в терминах негативной логики. Иногда утвержденное означает положительную логику, иногда отрицательную логику и не мыслить только одним способом. (то же самое касается мышления, что подтверждено или включено - это положительное напряжение, VCC, а отключенное или выключенное - заземление)
В частности, с помощью этой побитовой операции можно читать код в любом случае: «Я обнуляю эти биты» или «Я не обнуляю эти биты». Потому что оба правильные, просто разница в стиле.
Так же «просто» записать 0xC как 0xF3, если вам говорят устно, например, или если в таблице данных указано, что биты [3: 2] - это что-то и то-то, когда ноль. Мозгу не сложно обработать это как 0xC, чтобы обработать его как 0xF3, вам нужно найти дополнительную информацию о длине вещи, а затем обработать биты до и после, прежде чем достигнуть 0xF3. Или вы сделали 0xF3 в уме из 0x0C, и вы могли бы просто использовать ~ 0x0C и сохранить шаг. Если есть диаграмма, показывающая все биты рядом с отмеченными полями, тогда стакан становится наполовину пустым или наполовину полным, вы и ваши глаза можете легко сфокусироваться на негативе и потянуть 0xF3 напрямую или сфокусироваться на 0x0C, а затем инвертировать в получить 0xF3 или сфокусироваться на 0xF3 и нужно инвертировать, чтобы получить 0x0C.
Два преимущества, одно гораздо менее важное, чем другое, заключаются в том, что на некоторых процессорах он напрямую связан с инструкцией, и оптимизатору не приходится работать так усердно (микрооптимизация), второе - это привычка избегать ошибок в программном обеспечении. Если вы использовали int несколько лет назад с 0xFFFFFFF3, а затем скомпилировали этот код сегодня без каких-либо модификаций по сравнению с 64-битной машиной, вы, возможно, столкнулись с ошибкой. если этот метод обычно использовался в коде, то есть еще много работы по переносу. Если бы использовался ~ 0xC, этот код мог бы быть перенесен более плавно. Одно подразумевает размер переменной, другое - нет.
person
old_timer
schedule
23.01.2012