v =(v == 0?1:0);を書くより良い方法はありますか?[閉まっている]


465

変数を0と1の間で切り替えます。0の場合は1に設定し、それ以外の場合は1の場合は0に設定します。

これは非常に基本的な操作であり、頻繁に記述しているので、可能な限り最短で明確な方法を調べたいと思います。ここまでが私のベストです:

v = (v == 0 ? 1 : 0);

これを改善できますか?

編集:質問は、明確さを保ちながら上記のステートメントを最も少ない文字数で書く方法を尋ねています-これはどのように「本当の質問」ではないのですか?これはコードゴルフの練習を意図したものではありませんでしたが、ゴルフとしてアプローチする人々からいくつかの興味深い答えが出ています-ゴルフが建設的で示唆に富んだ方法で使用されているのを見るのは素晴らしいことです。


20
これは、私にはすでにシンプル/明確/短いように見えます。
Mob、2011

136
策略:v = +!v;
jAndy

48
「より良い」が「より速い」も意味する場合:jsperf.com/v-0-1-0
pimvdb

7
@モビンガ:+1。これは必要なだけ簡単です。私が見る他のすべての答えは混乱を招き、それらのいくつかはロジックを変更します。バグの紹介。
イアン・ボイド

8
@holodocあなたの意見を表現するためのより良い解決策は、オリジナルが最良の方法であると感じ、それがそうであると感じる理由について詳しく説明する答えを作成することです。また、投票して他の人があなたの回答を簡単に支持できるようにします。
チャックファンデルリンデン

回答:


721

あなたは単に使うことができます:

v = 1 - v;

もちろん、これは変数が適切に初期化されていること、つまり変数の値が0または1であることを前提としています。

より短いが、あまり一般的でない演算子を使用する別の方法:

v ^= 1;

編集:

明確にするために; 私はコードゴルフとしてこの質問に取り組みませんでした。オペレーターの副作用のようなあいまいなトリックを使用せずにタスクを実行する短い方法を見つけるためだけです。


206
これらは、細かくカットされたガラスや珍しい開花蘭のような美しいコード行です。論理層をまっすぐに到達し、可能な限り最適な操作で1と0の数学を直接処理した方法が気に入っています。私は自分のプロジェクトでこれらを使用しますが、残念なことに、同僚がコードを理解する必要がある場合は、デフォルトでよりロジックベースのアプローチにする必要があります。ありがとうございます、あなたの答えは私の一日を作りました。
Ollie Glass

37
コードの内容を示すコメントをいつでも追加できます。
Prusse

25
@Kevin:これが明らかに質問に答えないことは真実ではありません。qは、「変数を0と1の間で切り替えたい」と言っています。非常に合理的な解釈は、これは変数の値がすでに0または1であることを意味します。この解釈/制限は、回答で明示的にされました。世界で何に反対することができますか?
LarsH

50
@Matthew v ^= 1は、明確にわからない人はプログラミングをやめるべきだと言うのは少し厳しいと思います。前述のように、これは一般的な演算子の1つではなく、と同じことを行いませんv = v ^ 1。また、演算子は異なる言語(VB)で完全に異なる何かを意味します。はい、簡単に調べると、そのXOR演算子がわかり、その動作を理解できますが、多くの場合、一見しただけではわかりにくい場合があります。仕事を辞める必要があるとは思いません。
JD Isaacks、2011

80
これを書いて15文字を節約し、40文字のコメントを使用して説明すると、本当に改善されますか?
マイケルマイヤーズ

343

以来は0あるfalse1であるtrue値。

v = (v ? 0 : 1);

あなたは満足している場合に使用するtrueと、false数字の代わりに

v = !v;

またはそれらが数字でなければならない場合:

v = +!v; /* Boolean invert v then cast back to a Number */

55
その+前に魔法をかけるだけです!。すごく汚い!でもクール:p
jAndy

1
@Quentin -これは、彼が持っている場合は男のコードを破るだろうswitch(v){ case 0 ...か(V == 0)または0 === V場合は、彼のアプローチに加えて、彼の結果を変更している....場合
ブライアン

34
それをにこやかにしてください({v :+! v}).v
pimvdb 2011

17
@ブライアン:その魔法の+サインではない!¯\ _(ツ)_ /¯
jAndy

11
v = (v ? 0 : 1)明確で慣用的なJSの+1 。
Bennett McElwee

200

v = (v + 1) % 2さらに多くの値を循環する必要がある場合は、を変更2(n + 1)ます。0、1、2を循環させる必要があるとしましょうv = (v + 1) % 3


2
サイクルが大好き!それは本当に賢いです。
Ollie Glass

16
トグルをサイクルとして考えるための+1。どれほど柔軟かを考えると簡単です。
Guffa

3
+1も堅牢なモジュラーソリューションを提供します。実際にconstは、マジックナンバー2、3、...の代わりに変数を使用することをお勧めします
oosterwal

2
より短い(ハッカーの)方法:++v % 30、1、2を循環したい場合
ハラルドマーティン

75

あなたはそれのために関数を書き、それを次のように使うことができます:

v = inv(v)


30
+1私はこれが最もクリーンな解決策であることに強く同意します(しかし、inv関数:Pに含まれるもの)
Lea Hayes

4
私はこの答えを+1よりも多く与えることができるといいのですが。一般的なコードが盲目的に明らかでない場合は、わかりやすい名前の関数でラップする必要があります。
TehShrike 2011

11
@TehShrike invわかりやすい名前だと思いますか?
Bennett McElwee 2011

3
@Bennett McElwee:inv =反転。いつも私にはよくある略語のように見えました。
ダニエル

51
なぜそれを短縮するのか、それを 'invert'または 'toggle'と呼び、コードを読みやすくします。これを80列のパンチカードなどに取り付けようとしているわけではありません。
チャックファンデルリンデン

50

1以外の可能性を気にしない場合:

v = v ? 0 : 1;

上記の場合、vが0、false、未定義、またはnullの場合、vは最終的に1になります。この種のアプローチを使用する場合は注意してください。vが「hello world」であっても、vは0になります。


2
それは値を反転しません。つまりv = v ? 0 : 1
グッファ

3
@Guffa-失読症をキャッチするための+1 ...
ブライアン

3
これは、同僚と一緒に使用できる私のお気に入りのロジックベースの回答です(@Guffaの回答は数値ベースと見なしています)。不必要なテスト(v == 0)を行って括弧で囲み、絶対最小文字数までそれを取り除く方法が好きです。ありがとうございました。
Ollie Glass

1
私も@Guffaの回答の大ファンです-リナードスカイナードの言葉で言えば、シンプルな男にしてください;)
ブライアン

2
「真実の」値を理解するための+1。
zzzzBov 2011

44

v = 1 - v、またはv ^= 1またはのような行v= +!vはすべて仕事を完了しますが、それらは私がハックと呼ぶものを構成します。これらは美しいコード行ではありませんが、意図した効果を得るための安価なトリックです。1 - v「値を0と1の間で切り替える」ことは伝えません。これにより、コードの表現力が低下し、別の開発者がコードを解析する必要がある場所(小さな場所ではあります)が導入されます。

代わりにのような機能があるv = toggle(v)と、一目で目的がわかります。


8
-1、真剣にv=1-v、トグルを伝えませんか?
ブリンディ

22
1-v確かにトグルを通信できますが、それだけが通信します。たとえば、0のラインv=1、またはを中心とするミラーリング変換を通信することもできv=0.5ます。この意味で、これは比較的あいまいです。それが意図された意味にvなる0か、1制限されることを知っているだけで、他の開発者(またはあなたの将来の自己)がこの単純な行を理解する前にそのコンテキストを理解することを余儀なくされることは事実です。あなたはそれほど明確にすることはできませんv = toggle(v)
レイ

10
v ^= 1ただし、論理演算を理解していれば完全に明確ですが、プログラマーの方がより適切です。それがとの違いだと思いますv=1-v。1つは論理演算で、もう1つは算術演算です。私たちは、数学的ではなく論理的な概念を表現しようとしています。
マシュー

6
@Matthew Read:これは私の考えを上手くまとめた素晴らしいステートメントです:「私たちは数学的なものではなく論理的な概念を表現しようとしているのです。」v ^= 1ただし、ビット単位のxorとして解釈できるため、あいまいさもあります。
Ray

6
プログラマーにとって(そしてもちろん、私はオタクのようなオタクを意味します)、これらは非常に明確です。それらは単純であるため、エレガントなソリューションであるため、ハックではありません。
gion_13

38

正直さと数学的整合性-この「回答」への投票数を考慮して-この回答を編集するように私を導いた。私は、それが「深い」ものではなく、短い皮肉として意図されたので、できるだけ長く延期した。どんな説明も目的に反するように見えたが、コメントは誤解を避けるために私が明確でなければならないことを明らかにしている。

私の元の答え:

仕様のこの部分の表現:

0の場合は1に設定し、それ以外の場合は0に設定します。

最も正確なソリューションは次のとおりです。

v = dirac_delta(0,v)

まず、告白:私はなかった私のデルタ関数が混乱してしまいます。クロネッカーデルタの方が少し適切でしたが、ドメインに依存しないものを望んでいたほどではありません(クロネッカーデルタは主に整数にのみ使用されます)。しかし、私は本当にデルタ関数を使用すべきではなかった、と私は言ったはずです:

v = characteristic_function({0},v)

明確にさせてください。関数はトリプル(X、Y、f)であり、XYはセット(それぞれドメインドメインと呼ばれます)であり、fYの要素をXの各要素に割り当てる規則であることを思い出してください。トリプル(X、Y、f)f:X→Yと書くことがよくあります。Xのサブセット、たとえばAが与えられると、関数 isである特徴的な関数があります(χ Aは X→{0,1}またはℕなどのより大きなコドメインへの関数と考えることもできます)。この関数は、次のルールで定義されています。

χ A(X)= 1の場合のx∈A及びχ A(X)= 0であれば、X∉A

真理値表が好きなら、それは「Xの要素xはサブセットAの要素ですか?」という質問の真理値表です。

したがって、この定義から、ここで必要なのは特性関数であり、Xに 0とA = {0}を含む大きなセットがあることが明らかです。それは私が書いておくべきだったものです。

デルタ関数についても同様です。そのためには、統合について知る必要があります。あなたはすでにそれを知っているか、または知りません。そうでなければ、ここで私が理論の複雑さについてあなたに言うことはできませんが、私は一文の要約を与えることができます。対策集合上のXは、「平均値を機能させるために必要とされていること」の本質です。それは我々が設定されている場合ということであるXおよび測定μをそのセットに続い関数のクラスがあるX→ℝと呼ばれる、測定可能な機能表現がいるX FDμ、いくつかのあいまいな意味で理にかなっているとあるが、 「平均」FオーバーX

セットのメジャーを指定すると、そのセットのサブセットの「メジャー」を定義できます。これは、サブセットにその特性関数の積分を割り当てることによって行われます(これは測定可能な関数であると想定しています)。これ、無限または未定義にすることできます(2つは微妙に異なります)。

周りには多くの対策がありますが、ここで重要な2つがあります。1つは、実際のラインの標準メジャー ℝです。この対策のために、そして Dμfはあなたが学校で教えられて得るものはかなりある(まだ学校で教え微積分ある?):合計小さな長方形アップし、より小さく、より小さな幅を取ります。このメジャーでは、間隔のメジャーはその幅です。ポイントのメジャーは0です。

任意のセットで機能する別の重要な測定は、ポイント測定と呼ばれます。関数の積分がその値の合計になるように定義されています。

X FDμ=Σ X∈Xの F(X)

このメジャーは、各シングルトンセットにメジャー1を割り当てます。これは、サブセット自体が有限である場合に限り、サブセットに有限メジャーがあることを意味します。また、有限積分を行う関数はほとんどありません。関数は、有限積分を持っている場合は、それだけに非ゼロでなければならない可算ポイントの数。したがって、おそらくあなたが知っている関数の大部分は、この測定では有限積分を持ちません。

そして今、デルタ関数に。非常に広い定義を取ってみましょう。測定可能な空間(X、μ)(メジャーが設定されたセットです)と要素a∈Xがあります。我々は、 "定義" デルタ関数(に応じて"機能"である)δ A X→ℝ:プロパティとそのδ (x)= 0の場合、X≠X δ A Dμ= 1

これについて把握するための最も重要な事実は次のとおりです。デルタ関数は関数である必要はありません。それはされません適切に定義された:私は何を言っていないδ ()です。

この時点で何をするかは、あなたが誰であるかに依存します。ここの世界は2つのカテゴリーに分かれます。あなたが数学者なら、あなたは次のように言います:

さて、デルタ関数が定義されていない可能性があります。その仮想的な特性を見て、それ定義されている適切な家を見つけることができるかどうかを確認してみましょう。私たちはそれを行うことができ、最終的にはディストリビューションになります。これらは(必ずしも)関数ではありませんが、関数のように動作するものであり、多くの場合、関数であるかのように操作できます。しかし、それらにはないもの( "値"など)があるため、注意する必要があります。

数学者でない場合は、次のように言います。

では、デルタ関数が正しく定義されていない可能性があります。誰がそう言う?数学者の束?それらを無視してください!彼らは何を知っていますか?

聴衆の気分を害したので、続けます。

ディラックのデルタは通常、その標準的な指標と実際のラインのポイント(多くの場合、0)のデルタ関数であると解釈されます。したがって、自分のデルタを知らないというコメントについて不満を言う人は、この定義を使用しているためそうしています。それらに対して、私は謝罪します:(ハンプティ・ダンプティによって普及したように)数学者の防御を使用することでそれからくるくる回ることができますが、それが正しいように単純にすべてを再定義します)標準的な用語を使用して別のものを意味することは悪い形です。

しかし、そこに ある、私はそれをやりたいと、それは私がここに必要があることですし、デルタ関数が。私が取る場合はポイントの測定をセットにXそこ本物の機能δ X→ℝ:デルタ関数の満たす基準は。これは、我々が機能を探しているためであるX→ℝ以外ではゼロである情報の唯一欠けている部分ではその値です。その値の全ての合計は1そのような機能はシンプルでされていること、および、そのようなことは、と合計を1にするには、値に1を割り当てるだけです。これは、{a}の特性関数に他なりません。次に:

X δ A Dμ=Σ のx∈X δ A(X)=δ A()= 1。

したがって、この場合、シングルトンセットの場合、特性関数とデルタ関数は一致します。

結論として、ここには「関数」の3つのファミリーがあります。

  1. シングルトンセットの特徴的な機能、
  2. デルタ関数、
  3. クロネッカーデルタ関数。

これらの2番目は、他のいずれかがポイントメジャーを使用する場合の例であるため、最も一般的です。しかし、1番目と3番目には、常に真の機能であるという利点があります。3番目は、実際には、ドメインの特定のファミリー(整数またはそのサブセット)の最初の特別なケースです。

それで、最後に、私が最初に答えを書いたとき、私はそうではありませんでした正しく思考を(私はこれまでのところ、私がされたと言っているよう行かないだろう混乱し、私はちょうど私が実証されてきた期待してください、私は時に話しているか知っています私は実際に最初に考えました、私はあまり考えませんでした)。ディラックデルタの通常の意味はここで必要なものではありませんが、私の答えのポイントの1つは、入力ドメインが定義されていないため、クロネッカーデルタも正しくなかったことです。したがって、(私が目指していた)最良の数学的な答えは、特徴的な関数だったでしょう。

それがすべて明確であることを願っています。また、TeXマクロの代わりにHTMLエンティティを使用して、数学の部分を再度記述する必要がないことも願っています。


37
+1-dirac_delta関数を知らないためにQuentinに反対票を投じることができれば、私はそうします。彼がどの大学に通ったのか知りたいのですが、デジタル処理の基本的なことさえ知らなければ、そこから雇うことはないと思います。私がクエンティンがあなたが試みていたユーモアのビットを把握することができなかったので、私はさらにクエンティンに反対票を投じます。
2011

23
すべての回答に反対票を投じた場合、理解できませんでした...多くの回答に反対票を投じることになります。
Seamus

4
こんにちはアンドリュー、久しぶりだ。
ティムダウン

4
@ティム:良い悲しみなので、それはあります!そして、バミューダの司教はどうですか?(私はそれを覚えていましたか?)私はこのコメントスレッドが追いつくのに最適な場所ではないと思います... 17年ですね。
Andrew Stacey

3
@Cԃաԃ「この答えは失敗しました...」ため息。あなたは私が数学者だと読んだのですね?この答えは、真空の球形のプログラマには完璧に機能するので、あなたが何に不満を言っているのかわかりません。
Andrew Stacey 2013

35

あなたができる

v = Math.abs(--v);

減分は値を0または-1に設定し、次にMath.abs-1を+1に変換します。


27
これは、「単純なタスクを実行する10000の方法を生成する」競争になりました。そして、私はすべての方法が好きです。
Josh、

27
v = Math.round(Math.sin(Math.PI/(v+3)));
Benoit

15
@Benoit-数式はv = 0とv = 1の両方で1です。これは正解です! v = Math.round(Math.cos(Math.PI/((v*2+1)+2)-2*v));:D
Teo.sk 2011

2
それで値が変わることはありません。もしv = 1、その後v = Math.Abs(-1)1です。もしv = 0、その後v = Math.Abs(-0)は0である
ポール

1
+1そして、これは私のもう1つの問題でした。
再帰的

34

一般に、2つの値を切り替える必要があるときはいつでも、2つのトグル値の合計から現在の値を引くだけです。

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 

2
これは面白くて創造的ですが、潜在的に危険です。v破損した場合は、2つの異なる値を突然切り替え始めます。(考慮すべき事項...)
oosterwal

1
興味深いアイデアの+1。OPや他の誰かがこの状況で実際に使用するわけではありませんが、この情報は脳のどこかに永久に存在するはずです。
Shimmy Weitzhandler、2011年

3
@oosterwal:確かに問題は腐敗にある...
GManNickG

@GManNickG:遅かれ早かれデータ破損が発生するので、それを検出しないことの結果を認識する必要があります。v3つ以上の状態のリストから2つの状態を交互に実行するために通常使用される場合、の破損vにより、プログラムが2つの完全に異なる状態を交互に実行する可能性があります。これにより、予期しない望ましくない結果が生じる可能性があります。これを避けるための教訓は、次のとおりです。 常にデータの妥当性チェックを実行します。
oosterwal

33

整数1または0でなければならない場合、括弧は必要ありませんが、その方法は問題ありません。これらのaをブール値として使用する場合は、次のようにすることができます。

v = !v;

10
この結果、Ollieの「v」は整数ではなくブール結果に設定されませんか?
ブライアン

12
はい、そうです。コード行の上の文で警告しました。これらのaをブール値として使用する場合
Michael Berkowski

23
v = v == 0 ? 1 : 0;

十分です!


7
答えよりも意見のほうが多いと思いませんか?
ブライアン

16
@ブライアン:「より良い」とは、実際にはすべての意見です。
pimvdb 2011

3
角かっこを外した方法が気に入っています。これにより、2、3文字が切り取られます。
Ollie Glass

9
@ブライアン:「答え」は「いいえ、これ以上書く方法はありませんv = (v==0 ? 1 : 0);です。他の誰もがゴルフをするさまざまな方法を見つけています。実際には質問に答えていません。それが私がこの回答に賛成票を投じた理由です。
Ian Boyd

19

ソリューションのリスト

私が提案したい3つの解決策があります。それらのすべてはに任意の値を変換する0(もし1trueなど)または1(もし0falsenullなど):

  • v = 1*!v
  • v = +!v
  • v = ~~!v

もう1つ、既に述べましたが、賢くて高速です(ただし、0sと1sでのみ機能します)。

  • v = 1-v

解決策1

次のソリューションを使用できます。

v = 1*!v

これは、最初に整数を反対のブール値(0to Trueおよびその他の値はFalse)に変換し、次にを乗算するときに整数として扱い1ます。その結果、0に変換され1、その他の値はに変換されます0

証明として、このjsfiddleを参照し、テストしたい値を指定してください:jsfiddle.net/rH3g5/

結果は次のとおりです。

  • -123整数0に変換されます
  • -10整数0に変換されます
  • -1整数0に変換されます
  • 0整数1に変換されます
  • 1整数0に変換されます
  • 2整数0に変換されます
  • 60整数0に変換されます

解決策2

mblase75が言及したように、jAndyは私のものとして機能する他のいくつかの解決策を持っていました:

v = +!v

また、最初に元の値からブール値を作成しますが、+代わりに1*を使用して整数に変換します。結果はまったく同じですが、表記は短くなります。

解決策3

別のアプローチは~~演算子を使用することです:

v = ~~!v

これは非常に一般的ではなく、常にブール値から整数に変換されます。


JavaScriptでは、変数に接頭辞+を付けて数値に変換できるため+!v、ソリューションと同じです(OPのコメントにあるjAndyのソリューション)。
Blazemonger、2011年

@ mblase75:はい、そうです。ブール値を整数に変換するとき1*に置き換えることができます+。私の答えの他のすべては同じままです。jAndyの答えは正しいですが、私のほうが詳細です。私の答えに彼/彼女の解決策を追加します。
Tadeck


17

別の答え、コメントと私の意見をまとめると、次の2つを組み合わせることをお勧めします。

  1. トグルに関数を使用する
  2. この関数内では、より読みやすい実装を使用します

これは、ライブラリに配置したり、別のJavaScriptフレームワークのプラグインにラップしたりできる関数です。

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

そして使い方は簡単です:

v = inv(v);

利点は次のとおりです。

  1. コードの重複なし
  2. あなたや誰かが将来これをもう一度読んだ場合、あなたはあなたのコードを最小限の時間で理解するでしょう。

彼らは?私は簡単なテストを実行しました:jsperf.com/function-vs-no-function/2と、違いはそれほど大きくないようです。
Martin Schlagnitweit 2011

25
7.5ns vs 8.8ns。その余分な1.3ナノ秒は本当にあなたを殺します。
Ian Boyd

5
私が節約した時間はいつも、家族をディズニーワールドに連れて行ってくれました!:-)
トム

1
まったく正しい。「賢い」ソリューションを書いている人は、おそらく他のプログラマーのコード「宝石」を維持する必要がなかったでしょう
Avi

1
なんでfunction toggle(i){ return i == 0 ? 1 : 0 }
ビリームーン

13

なぜあなたはあなた自身のブール値を作りたいのか分かりませんか?ファンキーな構文が好きですが、わかりやすいコードを書いてみませんか?

これは最短/最速ではありませんが、最も明確な(そして誰にとっても読みやすい)は、既知のif / else状態を使用することです。

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

明確にしたい場合は、数値ではなくブール値を使用してください。ほとんどの場合、十分に高速です。ブール値を使用すると、次の構文を使用できます。

v = !v;

1
これが実際の私の好ましい答えです。しかし、三項演算子 vs if-elseは神聖な戦争であり、ヒューズを点灯したくありませんでした。そうは言っても、最初の行はである必要があります=== 0。のサンプル入力で7は、正しい出力はですが 0、これは出力されます1
Ian Boyd

4
なんらかの例外をスローする代わりに、7のような入力を黙って修正する価値はありますか?コードが値を修正する前に、0または1のみを期待していたときに、他のコードが7に渡った場合はどうなるでしょうか。
チャックファンデルリンデン

12

元のソリューションの別の形式:

v = Number(v == 0);

編集:私の元のソリューションのエラーを指摘してくれたTehShrikeとGuffaに感謝します。


4
==演算子は、多くのシステムで(整数の代わりに)ブール値を返します。これは、vが整数として定義されており、ブールから整数への自動キャストで言語が優れている場合にのみ機能します。
TehShrike 2011

とても本当です。私はjavascriptのコンテキストで質問に答えていました(質問にタグが付けられた方法)。
カートケーラー2011

@Kurt Kaylor:Javascriptは、==演算子がブール値を返すシステムの1つであるため、元のソリューションとは異なります。
Guffa

@Guffa:私はjavascriptが暗黙的に型変換される弱く型付けされた言語であるという事実を利用しています(たとえば、 '0.0000' == 0、0 == ""、false == ""、false == 0、1 ==真など)。私はJavaScriptコンソールに「2 +真」を評価するために、例えば、値が0または1トライの整数を使用することができると私は同じように返されたブール値を使用することができ、あなたが買ってあげる3
クルトKaylor

1
@Kurt Kaylor:暗黙の変換を強制する状況でのみ機能します。たとえば試してみる'opacity:'+trueと、のopacity:true代わりに終わりますopacity:1
グッファ

11

もっとはっきりさせておきます。

どういうv意味ですか?

たとえば、vがある状態の場合です。オブジェクトのステータスを作成します。DDDでは、値オブジェクト。

この値オブジェクトにロジックを実装します。次に、より読みやすい、より機能的な方法でコードを記述できます。ステータスを切り替えるには、現在のステータスに基づいて新しいステータスを作成します。次に、ifステートメント/ロジックがオブジェクトにカプセル化され、単体テストを実行できます。valueObjectは常に不変であるため、IDはありません。したがって、値を変更するには、新しい値を作成する必要があります。

例:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);

6
エンジニアリング以上?
alejandro5042

6
私を笑わせるための+1
Denshi


10

これがありません:

v = [1, 0][v];

ラウンドロビンとしても機能します。

v = [2, 0, 1][v]; // 0 2 1 0 ...
v = [1, 2, 0][v]; // 0 1 2 0 ...
v = [1, 2, 3, 4, 5, 0][v]; // 0 1 2 3 4 5 ...
v = [5, 0, 1, 2, 3, 4][v]; // 0 5 4 3 2 1 0 ...

または

v = {0: 1, 1: 0}[v];

最後のソリューションの魅力は、他のすべての値でも機能します。

v = {777: 'seven', 'seven': 777}[v];

(変化する)値とを取得するような非常に特殊なケースではundefined、このパターンが役立つ場合があります。

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...

9

これはJavaScriptなので、単項+を使用してintに変換できます。

v = +!v;

これは論理NOTvtrueif v == 0またはfalseif を与えるv == 1)になります。次に、返されたブール値を対応する整数表現に変換します。



7

もう一つ: v=++v%2

(Cでは簡単です++v%=2

ps。ええ、私はそれが二重代入であることを知っていますが、これはCのメソッドをそのまま書き直したものです(これはそのままでは機能しません。JSプリインクリメント演算子が左辺値を返さないためです)。


3
あなたのCバージョンは違法です。++演算子の結果は変更できません(左辺値ではありません)。についてはv=++v%2v2回変更しています。それがJavaScriptで適切に定義されているかどうかはわかりませんが、必須ではありません。 v = (v+1) % 2
キーストンプソン

少なくともc++それは-前置インクリメント演算子の方が優先度が高く、変数を「インプレース」に変更するため、左辺値として使用できます。私はJSの実装が++左辺値として扱うことができないようなものだと思います:/そうです、これは冗長ですが、私は別の方法だけを見せようとしていました-すでにより良い解決策が投稿されています:)
Adam Jurczyk

3
+1。v =(v + 1)%2と書くことができます。
niktrs 2011

7

入力が1または0であることが保証されている場合は、次のように使用できます。

v = 2+~v;

7

array {1,0}を定義し、vをv [v]に設定します。したがって、値0のvは1になり、逆も同様です。


私の解決策は正しいです。もしそれが気に入らなければ、理由を書いてください。あなたのコメントは誰にも役立ちません。私の解決策は、決定を下すのではなく、変数を読み取ります。これはより少ないCPUを必要とします。
S ..

5

それを行う別の創造的な方法は、vあらゆる値に等しいので、常に戻り値0または1

v = !!v^1;

3
2つ!!は論理!!!!演算で何も結果になりません。そこに置くことができ、同じになりますが、4つの不要な演算が発生します
Alex K

10
@Alex:!!boolにキャストします。!!(1) === trueそして!!(0) === false
nickf

1
@nickf:ああ、それでv = Boolean(v^1)もっと情報が得られると思います、説明してくれてありがとう-キャストについては考えていませんでした
Alex K

1
@アレックス、「論理数学」?これが、数学者が貧しいプログラマーである理由です。誤解しないでください。優れたプログラマーは数学の理解も得意です。しかし、これは論理的な数学とは何の関係もありません。これは、少なくともJavaScriptで任意の式が与えられると、!それをブール値にキャストする言語構造です。別のもの!を追加すると、そのブール値が無効になります。ここではキャストは暗黙的に行われ、最終結果は機能します。-1は必要ありません。
Yanick Rochon、2011

1
私は数学者ではありません。これを試して、自分でjsperf.com/javascript-boolean-test
Alex K

4

vの可能な値が0と1のみの場合、任意の整数xに対して、次の式:v = Math.pow((Math.pow(x、v)-x)、v); 値を切り替えます。

私はこれが醜い解決策であり、OPがこれを探していなかったことを知っています...しかし、私がトイレにいるとき、私はちょうど別の解決策について考えていました:P



3
v=!v;

v = 0とv = 1で機能します。状態を切り替えます。


1

この場合のように2つの値しかない場合(0、1)、intを使用するのは無駄です。むしろブール値を求めて少しずつ作業します。私は私が想定していることを知っていますが、2つの状態間の切り替えの場合はブール値が理想的な選択のようです。


1

ええと、Javascriptではそのブール比較だけでも期待どおりの結果が得られることがわかっています。

つまりそれv = v == 0で十分です。

以下はそのためのコードです:

var v = 0;
alert("if v  is 0 output: " + (v == 0));

setTimeout(function() {
  v = 1;
  alert("if v  is 1 Output: " + (v == 0));
}, 1000);

JSFiddle:https ://jsfiddle.net/vikash2402/83zf2zz0/

これがあなたを助けることを願っています:)


これは値の切り替えに有効ですが、値は0と1の間trueではなく、との間で切り替わりますfalse。を使用v == 0して、条件内の変数の値を決定できますが、値0または1を使用する場合は、のようなものを使用するか、v == 0 ? 0 : 1それNumber(v)を取得する必要があります。(また、あなたが使用することができますv = !v;切り替えることtruefalse。)
Guffa

ええ、それは..ありがとうございました:)
Vikash Pandey

0

v =数値(!v)

これは、反転ブール値を目的の出力である数値に型キャストします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.