質問するログイン新規登録

回答編集履歴

2

加算演算子

2019/07/13 09:46

投稿

think49
think49

スコア18194

answer CHANGED
@@ -31,4 +31,107 @@
31
31
 
32
32
  と書きます。
33
33
 
34
+ ### 配列の各要素に対して順番に論理和
35
+
36
+ コメントよりコードを引用します。
37
+
38
+ > ```JavaScript
39
+ > x = false;
40
+ > for(let i=0; i<10; ++i){
41
+ > x |= isTrue(data[i]);
42
+ > }
43
+ > ```
44
+
45
+ このコードの場合、
46
+
47
+ 1. `isTrue(data[i])` を実行する
48
+ 2. x が truthy なら、代入値は必ず 1
49
+ x が falsy なら、isTrue() の返り値であるBoolean値を Number 型に変換した値 (1 or 0)
50
+
51
+ となるわけですが、x が truthy であっても、**isTrue() が必ず呼び出されてしまう**という問題があります。
52
+ ですので、私なら前述の通り、`if` 文を使います。
53
+
54
+ ```JavaScript
55
+ 'use strict';
56
+ function isTrue (number) {
57
+ return number < 100;
58
+ }
59
+
60
+ function sample1 (data) {
61
+ let x = false;
62
+
63
+ for (let i = 0; i < 10; ++i) {
64
+ x |= isTrue(data[i]);
65
+ }
66
+
67
+ return x;
68
+ }
69
+
70
+ function sample2 (data) {
71
+ let x = false;
72
+
73
+ for (let i = 0; i < 10; ++i) {
74
+ if (!x) x = isTrue(data[i]);
75
+ }
76
+
77
+ return x;
78
+ }
79
+
80
+
81
+ function test (args, fn1, fn2) {
82
+ const result1 = fn1(args), result2 = fn2(args);
83
+ console.log(result1, result2);
84
+ }
85
+
86
+ test([1,2,3,100], sample1, sample2); // 1 true
87
+ test([100,101,102], sample1, sample2); // 0 false
88
+ ```
89
+
90
+ 「`break` 文を使えば、論理和さえ不要」という考え方もありますが、そこは「別の処理の関係でbreak出来ない」という事にしておきます。
91
+
92
+
93
+ ### ビット列
94
+
95
+ 今回の命題にはオーバースペックですが、**ビット列**を利用すると、各要素に対応する `flag` を一つの変数で管理することが出来ます。
96
+
97
+ ```JavaScript
98
+ function sample3 (data) {
99
+ let x = 0;
100
+
101
+ for (let i = 0; i < 10; ++i) {
102
+ x += isTrue(data[i]) * Math.pow(2, i);
103
+ }
104
+
105
+ return x;
106
+ }
107
+
108
+ const flags = sample3([100,2,103,4]);
109
+
110
+ console.log(flags.toString(2)); // 1010
111
+ ```
112
+
113
+ 今回の命題としては、
114
+
115
+ ```JavaScript
116
+ flags !== 0
117
+ ```
118
+
119
+ が変数 `x` に期待される値という事になります。
120
+
121
+ ### 加算演算子
122
+
123
+ ビット列と同じ理屈で「論理和」を「加算」に置き換える方法もあります。
124
+
125
+ ```JavaScript
126
+ for (let i = 0; i < 10; ++i) {
127
+ x += isTrue(data[i]);
128
+ }
129
+ ```
130
+
131
+ isTrue が Boolean 値を返すなら、`x` に加算されるのは 0 or 1 です。
132
+ x には**各要素が truthy だった数**が代入され、値が 0 でなければ、論理和が成立している事になります。
133
+
134
+ ※こちらも「無駄にisTrueが実行されてしまう」という問題があるので、論理和だけが必要であれば、`if` 文を私は使います。
135
+
136
+
34
137
  Re: brsice さん

1

誤変換を修正

2019/07/13 09:46

投稿

think49
think49

スコア18194

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  x = true;
24
24
  ```
25
25
 
26
- 結果は同じはずですが、**短絡評価**に異議があるのなら、
26
+ 結果は同じはずですが、**短絡評価**に意義があるのなら、
27
27
 
28
28
  ```JavaScript
29
29
  if (!x) x = true;