console.log("Таблица истинности для a && b (битовые операции)");
console.log("a\tb\ta & b");
console.log("---------------");
// Используем битовые операции с числами 0 и 1
for (let a = 0; a <= 1; a++) {
for (let b = 0; b <= 1; b++) {
// Битовая операция И
const result = a & b;
console.log(`${a}\t${b}\t${result}`);
}
}
На собесах, идея использования вложенных циклов - это самое популярное решение. Тем временем мне больше нравится такой вариант:
for(let i = 0; i < 4; i++) {
const a = i & 1;
const b = i >> 1 & 1;
console.log(`\t${a} & ${b} = ${a && b} (${Number(!(!a || !b)}))`);
}
Здесь я добавил иллюстрацию закона Де Моргана, пока не обращайте на него внимание.
Интересно, что многие программисты жалуются на излишнюю сложность второго варианта, мол нет насмотренности на битовые операци, сложно быстро понять код.
В целом с булевой алгеброй тоже возникают сложности, часто люди не могут применить закон Де Моргана, чтобы упростить свои условия. Я, конечно, по-стариковски думаю "Да, были люди в наше время, Не то, что нынешнее племя", но понимаю, что код должен быть понятен всем участникам проекта и первый вариант имеет в этом смысле явное преимущество, но при этом я хотел бы работать с ребятами, которые легко читают второй вариант, в целом это будет совсем другой "средний уровень команды".
Поэтому, интересно ваше мнение какой из двух вариантов кода вам нравится больше и почему? Пишите в комментариях 👇👇👇