Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чем заменить continue (https://javascript.ru/forum/misc/84413-chem-zamenit-continue.html)

voraa 05.09.2022 10:07

Цитата:

Сообщение от micscr
Все подробности выполнения побитовой операции полезно знать когда у тебя задача работать с битами, а у нас задача - привести число к целому.

Что такое n++? Это увеличение n на единицу? Вроде бы да.
Но когда мы пишем m = n++; мы учитываем все особенности этой операции.
Что такое побитовая операция? Если просто так сказать, то можно подозревать, что мы берем битовое представление аргумента (если это вещественное число, то все его 64 разряда м мантиссой и порядком) и работаем с этими битами. Но это не так. Мы же учитываем, что оно сначала преобразуется в 32 разрядное целое.

Что такое логическая операция &&? В фортране или паскале тоже есть логические операции (.AND. и and соответственно). Но если он пришел в js, то стек ни стек, а как выполняется && знать придется. Так же как придется знать, что во что прeобразуется при '10'+1 и при '01' == 1 и при x|0

micscr 05.09.2022 10:28

Не сравнивайте с ++ или &&.
Побитовые операции - очень редкие на самом деле по статистике использования в web стеке, использовать их для других задач - ненужно усложнять код такими низкоуровневыми деталями.
Вон в доках есть более забористые вещи - ~str.indexOf("Widget") - как аналог != -1 , из всего этого можно такую шифрограмму составить, как будто ни Роберт Мартин ни Фаулер никогда и ни для кого своих книг не писали

Aetae 05.09.2022 10:56

Я вот люблю битовые флаги, типа:
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);
    }

Но сейчас такое уже считается сложна, эх...

voraa 05.09.2022 11:08

Используются иногда.
Например в createNodeIterator
https://developer.mozilla.org/en-US/...teNodeIterator

Но чаще в С

Vlasenko Fedor 05.09.2022 12:07

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 без них никак

Alikberov 05.09.2022 13:55

Цитата:

Сообщение от micscr (Сообщение 547770)
Это у вас очень чудное правило.
Которое больше как фонит тем что вы не разобрались в разнице , мол эзотерика. Нет эзотерики, код для шага цикла ничего не возвращает, поэтому для него нет разницы, и писать ++i несколько паливно

Какaя разница в постинкременте или преинкременте там, где это ни на что не влияет?
А раз разницы нет - есть свобода для проявления индивидуально творческого стиля.
Иногда вообще пишут «I+++j»…:-/

Цитата:

Сообщение от Aetae (Сообщение 547782)
Я вот люблю битовые флаги, типа:
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")}`);

voraa 05.09.2022 16:57

Цитата:

Сообщение от Vlasenko Fedor
Редко, но используем, в базах данных с типами set, enum без них никак

Я бы Boolean(...) на !!(...) заменил :)

Aetae 05.09.2022 18:49

voraa, а я бы нет.)

Vlasenko Fedor 05.09.2022 19:29

Цитата:

Сообщение от Aetae
voraa, а я бы нет

100%
исходный код должен понятен большинству
а там может быть сборщик, минификатор, обфускатор ...

voraa 05.09.2022 20:16

Цитата:

Сообщение от Vlasenko Fedor
исходный код должен понятен большинству

Печально, что большинство такое.... непонятливое

Вспоминается COBOL, где надо было писать MULTIPLY X BY Y.
А что? Всем ведь понятно. X*Y не каждому дано понять.


Часовой пояс GMT +3, время: 20:34.