回答編集履歴

2

加算演算子

2019/07/13 09:46

投稿

think49
think49

スコア18166

test CHANGED
@@ -64,4 +64,210 @@
64
64
 
65
65
 
66
66
 
67
+ ### 配列の各要素に対して順番に論理和
68
+
69
+
70
+
71
+ コメントよりコードを引用します。
72
+
73
+
74
+
75
+ > ```JavaScript
76
+
77
+ > x = false;
78
+
79
+ > for(let i=0; i<10; ++i){
80
+
81
+ > x |= isTrue(data[i]);
82
+
83
+ > }
84
+
85
+ > ```
86
+
87
+
88
+
89
+ このコードの場合、
90
+
91
+
92
+
93
+ 1. `isTrue(data[i])` を実行する
94
+
95
+ 2. x が truthy なら、代入値は必ず 1
96
+
97
+ x が falsy なら、isTrue() の返り値であるBoolean値を Number 型に変換した値 (1 or 0)
98
+
99
+
100
+
101
+ となるわけですが、x が truthy であっても、**isTrue() が必ず呼び出されてしまう**という問題があります。
102
+
103
+ ですので、私なら前述の通り、`if` 文を使います。
104
+
105
+
106
+
107
+ ```JavaScript
108
+
109
+ 'use strict';
110
+
111
+ function isTrue (number) {
112
+
113
+ return number < 100;
114
+
115
+ }
116
+
117
+
118
+
119
+ function sample1 (data) {
120
+
121
+ let x = false;
122
+
123
+
124
+
125
+ for (let i = 0; i < 10; ++i) {
126
+
127
+ x |= isTrue(data[i]);
128
+
129
+ }
130
+
131
+
132
+
133
+ return x;
134
+
135
+ }
136
+
137
+
138
+
139
+ function sample2 (data) {
140
+
141
+ let x = false;
142
+
143
+
144
+
145
+ for (let i = 0; i < 10; ++i) {
146
+
147
+ if (!x) x = isTrue(data[i]);
148
+
149
+ }
150
+
151
+
152
+
153
+ return x;
154
+
155
+ }
156
+
157
+
158
+
159
+
160
+
161
+ function test (args, fn1, fn2) {
162
+
163
+ const result1 = fn1(args), result2 = fn2(args);
164
+
165
+ console.log(result1, result2);
166
+
167
+ }
168
+
169
+
170
+
171
+ test([1,2,3,100], sample1, sample2); // 1 true
172
+
173
+ test([100,101,102], sample1, sample2); // 0 false
174
+
175
+ ```
176
+
177
+
178
+
179
+ 「`break` 文を使えば、論理和さえ不要」という考え方もありますが、そこは「別の処理の関係でbreak出来ない」という事にしておきます。
180
+
181
+
182
+
183
+
184
+
185
+ ### ビット列
186
+
187
+
188
+
189
+ 今回の命題にはオーバースペックですが、**ビット列**を利用すると、各要素に対応する `flag` を一つの変数で管理することが出来ます。
190
+
191
+
192
+
193
+ ```JavaScript
194
+
195
+ function sample3 (data) {
196
+
197
+ let x = 0;
198
+
199
+
200
+
201
+ for (let i = 0; i < 10; ++i) {
202
+
203
+ x += isTrue(data[i]) * Math.pow(2, i);
204
+
205
+ }
206
+
207
+
208
+
209
+ return x;
210
+
211
+ }
212
+
213
+
214
+
215
+ const flags = sample3([100,2,103,4]);
216
+
217
+
218
+
219
+ console.log(flags.toString(2)); // 1010
220
+
221
+ ```
222
+
223
+
224
+
225
+ 今回の命題としては、
226
+
227
+
228
+
229
+ ```JavaScript
230
+
231
+ flags !== 0
232
+
233
+ ```
234
+
235
+
236
+
237
+ が変数 `x` に期待される値という事になります。
238
+
239
+
240
+
241
+ ### 加算演算子
242
+
243
+
244
+
245
+ ビット列と同じ理屈で「論理和」を「加算」に置き換える方法もあります。
246
+
247
+
248
+
249
+ ```JavaScript
250
+
251
+ for (let i = 0; i < 10; ++i) {
252
+
253
+ x += isTrue(data[i]);
254
+
255
+ }
256
+
257
+ ```
258
+
259
+
260
+
261
+ isTrue が Boolean 値を返すなら、`x` に加算されるのは 0 or 1 です。
262
+
263
+ x には**各要素が truthy だった数**が代入され、値が 0 でなければ、論理和が成立している事になります。
264
+
265
+
266
+
267
+ ※こちらも「無駄にisTrueが実行されてしまう」という問題があるので、論理和だけが必要であれば、`if` 文を私は使います。
268
+
269
+
270
+
271
+
272
+
67
273
  Re: brsice さん

1

誤変換を修正

2019/07/13 09:46

投稿

think49
think49

スコア18166

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- 結果は同じはずですが、**短絡評価**に異議があるのなら、
51
+ 結果は同じはずですが、**短絡評価**に意義があるのなら、
52
52
 
53
53
 
54
54