05.09.2022, 10:07
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от micscr
|
Все подробности выполнения побитовой операции полезно знать когда у тебя задача работать с битами, а у нас задача - привести число к целому.
|
Что такое n++? Это увеличение n на единицу? Вроде бы да.
Но когда мы пишем m = n++; мы учитываем все особенности этой операции.
Что такое побитовая операция? Если просто так сказать, то можно подозревать, что мы берем битовое представление аргумента (если это вещественное число, то все его 64 разряда м мантиссой и порядком) и работаем с этими битами. Но это не так. Мы же учитываем, что оно сначала преобразуется в 32 разрядное целое.
Что такое логическая операция &&? В фортране или паскале тоже есть логические операции (.AND. и and соответственно). Но если он пришел в js, то стек ни стек, а как выполняется && знать придется. Так же как придется знать, что во что прeобразуется при '10'+1 и при '01' == 1 и при x|0
Последний раз редактировалось voraa, 05.09.2022 в 10:09.
|
|
05.09.2022, 10:28
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,578
|
|
Не сравнивайте с ++ или &&.
Побитовые операции - очень редкие на самом деле по статистике использования в web стеке, использовать их для других задач - ненужно усложнять код такими низкоуровневыми деталями.
Вон в доках есть более забористые вещи - ~str.indexOf("Widget") - как аналог != -1 , из всего этого можно такую шифрограмму составить, как будто ни Роберт Мартин ни Фаулер никогда и ни для кого своих книг не писали
|
|
05.09.2022, 10:56
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Я вот люблю битовые флаги, типа:
const Action = {
DEFAULT: 0b000000000, // do nothng
DELETE: 0b000000001, // to trash
ARCHIVE: 0b000000010, // to archive
FINALIZE: 0b000000100, // remove "new" label and star
ADD_LABEL: 0b000001000, // add specified label
READ: 0b000010000, // mark as read
}
...
return Action.READ | Action.ARCHIVE | Action.FINALIZE;
...
if(action & Action.ARCHIVE) {
removeInboxIds.push(id);
}
Но сейчас такое уже считается сложна, эх...
__________________
29375, 35
|
|
05.09.2022, 12:07
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
const access = (value, action) =>
Boolean(
value &
{
read: 1,
create: 2,
edit: 4,
delete: 8,
}[action]
);
for (let i = 0; i < 16; i++) {
let res = [];
if (i & 1) res.push('read');
if (i & 2) res.push('create');
if (i & 4) res.push('edit');
if (i & 8) res.push('delete');
console.log(i, res, (i).toString(2).padStart(4, '0'));
}
console.log(access(3, 'edit'));
console.log(access(15, 'delete'));
Редко, но используем, в базах данных с типами set, enum без них никак
Последний раз редактировалось Vlasenko Fedor, 05.09.2022 в 17:59.
Причина: Добавил для наглядности в двоичной системе
|
|
05.09.2022, 13:55
|
|
Кандидат Javascript-наук
|
|
Регистрация: 16.08.2018
Сообщений: 109
|
|
Сообщение от micscr
|
Это у вас очень чудное правило.
Которое больше как фонит тем что вы не разобрались в разнице , мол эзотерика. Нет эзотерики, код для шага цикла ничего не возвращает, поэтому для него нет разницы, и писать ++i несколько паливно
|
Какaя разница в постинкременте или преинкременте там, где это ни на что не влияет?
А раз разницы нет - есть свобода для проявления индивидуально творческого стиля.
Иногда вообще пишут «I+++j»…
Сообщение от Aetae
|
Я вот люблю битовые флаги, типа:
const Action = {
DEFAULT: 0b000000000, // do nothng
DELETE: 0b000000001, // to trash
ARCHIVE: 0b000000010, // to archive
FINALIZE: 0b000000100, // remove "new" label and star
ADD_LABEL: 0b000001000, // add specified label
READ: 0b000010000, // mark as read
}
|
Если идти строго по Си, можно и так:
const C_Struct = {
Field_1 :1, // 1 бит
Field_2 :2, // 2 бита
Field_3 :2, // 2 бита
Field_4 :3 // 3 бита
}
var MyFields = {
_struct :C_Struct,
Fields :0x9D
}
function Read_CStruct(Struct, Field) {
var i = 0;
for(var id in Struct._struct) {
if(id == Field)
return (Struct.Fields >> i) & ~(-1 << Struct._struct[id]);
i += Struct._struct[id];
}
}
console.log(`Field_3: ${Read_CStruct(MyFields, "Field_3")}`);
Последний раз редактировалось Alikberov, 05.09.2022 в 14:01.
|
|
05.09.2022, 16:57
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от Vlasenko Fedor
|
Редко, но используем, в базах данных с типами set, enum без них никак
|
Я бы Boolean(...) на !!(...) заменил
|
|
05.09.2022, 18:49
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
voraa, а я бы нет.)
__________________
29375, 35
|
|
05.09.2022, 19:29
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Сообщение от Aetae
|
voraa, а я бы нет
|
100%
исходный код должен понятен большинству
а там может быть сборщик, минификатор, обфускатор ...
|
|
05.09.2022, 20:16
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от Vlasenko Fedor
|
исходный код должен понятен большинству
|
Печально, что большинство такое.... непонятливое
Вспоминается COBOL, где надо было писать MULTIPLY X BY Y.
А что? Всем ведь понятно. X*Y не каждому дано понять.
Последний раз редактировалось voraa, 05.09.2022 в 20:50.
|
|
|
|