Est-il une meilleure façon d'écrire v = (v == 0 ? 1 : 0);
Je veux basculer une variable entre 0 et 1. Si c'est 0 je veux le mettre à 1, sinon si c'est 1 je veux le mettre à 0.
C'est une opération fondamentale que j'ai à écrire aussi souvent que je voudrais étudier la plus courte, la plus claire possible de la façon de faire. Voici mon meilleur jusqu'à présent:
v = (v == 0 ? 1 : 0);
Pouvez-vous améliorer sur ce point?
Edit: la question est de savoir comment écrire la déclaration ci-dessus dans le moins de caractères, tout en conservant la clarté - comment est-ce 'pas une vraie question"? Ce n'était pas destiné à être un code de golf de l'exercice, bien que quelques réponses intéressantes viennent de personnes qui s'adressent à elle en tant que de golf - il est agréable de voir de golf utilisé dans un esprit constructif et de réflexion manière.
- Cela ressemble déjà simple/clair/court pour moi.
- la ruse:
v = +!v;
- Si "mieux" signifie également "plus rapidement": jsperf.com/v-0-1-0.
- Interressant, mais je pense que vous devriez tester avec l'affectation également, comme
v ^= 1;
ne se comportent pas de la même chose quev = v ^ 1;
: jsperf.com/v-1-v - C'est aussi simple que cela devrait obtenir. Toutes les autres réponses, je vois une source de confusion, et certains d'entre eux de changer la logique; introduire des bogues.
- comment alors? Je ne vois pas
v = v ^ 1
sur la page liée. - Personne n'a suggéré d'utiliser
v = v ^ 1;
, mais pimvdb:s test évalué l'expressionv ^ 1
, ce qui équivaut à un test dev = v ^ 1;
au lieu dev ^= 1;
. Le résultat est le même, mais ils ne fonctionnent pas exactement de la même. - Pourquoi ne pas utiliser
if(v == 0) { v = 1; } else { v = 0; }
? Je doute qu'il y est une différence dans la vitesse et il est beaucoup plus facile à lire si vous êtes nouveau dans le code. Si c'est plus facile à lire et à comprendre et il n'y a pas de réelle différence de performance, alors c'est mieux. - Je dois avouer que cette question est très intéressante, même si elle semble si simple...
- Votre chemin est le plus clair, donc il n'y a pas de raison de le changer. Il est également robuste, car la valeur pour
v
est garanti pour être dans la plage souhaitée, indépendamment de la valeur qu'il avait avant. Et cette robustesse est encore parfaitement visible. - Je suppose que j'ai mal compris. Lorsque vous avez dit qu'ils ne le sont pas "se comporter" de même, je pensais que vous vouliez dire, le résultat était différent, mais je suppose que vous parlez des différences de vitesse seul.
- Je suis aussi un spectacle de freak mais pour moi personnellement aucun gain de performances (surtout quand son petit) vaut la peine de sacrifier la lisibilité du code. C'est pourquoi je vote pour cette solution.
- Voter pour qui solution?
- J'ai voté pour l'OP de la solution (
v = (v == 0 ? 1 : 0);
) parce qu'il montre clairement la logique derrière cette ligne de code. Je ne dis pas que d'autres solutions sont mauvaises, mais à partir de mon expérience personnelle coller à la logique derrière le code est toujours la meilleure manière en particulier lorsque vous travaillez avec d'autres personnes ou si il ya une possibilité que le code peut être changé beaucoup de choses dans le futur par d'autres. - Non, vous avez voté pour la question. Les Votes pour les questions ne sont pas compare les votes pour les réponses, c'est par rapport à des voix à d'autres questions.
- Je ne comprends pas quel est le big deal? J'ai voté pour la Fpo solution à l'intérieur de son / le sien question parce qu'il / elle m'a demandé si il ya une meilleure façon de l'un qu'il / elle est à l'aide de / a fournis.
- Ce n'est pas une grosse affaire, mais ce n'est tout simplement pas la façon dont le site fonctionne. Bien sûr, vous pouvez voter pour la question, mais qui ne fonctionne pas comme un vote pour une réponse.
- Je n'ai pas le droit de vote pour les OP post afin de le qualifier comme réponse, je voulais juste lui montrer que sa solution originale a été le meilleur à mon avis.
- Vous pouvez utiliser n'importe quelle raison vous voulez, mais le vote sera juste un vote pour une bonne question.
- Exactement ce que dois-je faire pour le rendre absolument clair que je n'aime pas ce que mon vote est utilisé en dehors du fait qu'il permet à l'OP savoir que son / le sien est le meilleur à mon avis? Voulez-vous arrêter de faire des remarques si je upvote de votre poste?
- Je vais essayer de vous faire comprendre que votre vote ne sera pas interprété de cette façon, mais vous pouvez continuer à penser que si vous le souhaitez.
- puis-je détecter un soupçon de perfectionnisme? 😉
- ou probablement
v^=1
- Une meilleure solution à donner votre avis serait de créer une réponse qui dit que vous vous sentez à l'original est le meilleur moyen, et expliquer POURQUOI vous vous sentez que c'est le cas. qui permet aussi à d'autres gens de facilement côté avec votre réponse par vote it up.
- van der Linded je n'aime pas la redondance. Tout ce que j'avais à dire a été dit dans mes commentaires sur le post original.
- Voir ma réponse!
- Tout ce que vous utilisez, faire une macro afin de ne pas répéter tous sur la place - oh, si vous étiez à l'aide de C je veux dire. Faire une fonction 🙂
- Cette question semble être hors-sujet parce que c'est un code de golf de question
- Votre question fait l'un des greatests les machines de Rube Goldberg dans l'ensemble de stackoverflow.
- Vous pourriez ne pas voulez obtenir la fantaisie. Cause que vous voulez le garder lisible.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser:
Bien sûr, cela suppose que la variable est initialisée correctement, c'est à dire qu'il n'a que la valeur 0 ou 1.
Une autre méthode qui est plus courte, mais utilise une commune de moins de l'opérateur:
Edit:
Pour être clair, je n'ai jamais abordé cette question en tant que code de golf, juste pour trouver un chemin court de faire la tâche sans l'aide d'aucun obscurcissement des figures, comme les effets secondaires des opérateurs.
v=7
. Résultat d'un algorithme original:0
. Résultat d'algorithme modifié:6
. Imaginez l'entrée provient d'une modifiables par l'utilisateur du fichier de configuration; où l'utilisateur peut entrer zéro/zéro.If it's 0, I want to set it to 1, else set it to 0.
v ^= 1
. Si c'est pas clair alors je pense que vous devriez arrêter la programmation et la pratique les principes fondamentaux de la logique des opérations un peu.v = 1 - v
est intelligent, mais pas aussi clair, cependant, puisque ce n'est pas une opération logique. C'est beaucoup mieux pour représenter la logique avec la logique plutôt que sur les mathématiques.v ^= 1
claire devrait arrêter la programmation est un peu dur je pense. Comme dit précédemment, ses pas l'un des plus commune des opérateurs et il ne fait pas la même chose quev = v ^ 1
. En outre, l'opérateur signifie quelque chose de complètement différent dans les différentes langues (VB). Oui un rapide coup d'oeil-up va vous dire que c'est un opérateur XOR et vous comprendrez ce que sa fait, mais pour beaucoup, il peut ne pas être évident au premier coup d'œil. Je ne pense pas que cela signifie que vous devez quitter votre emploi.v = v^1
sont exactement les mêmes, tout commev += 1
etv = v+1
sont les mêmes. Au moins, les résultats sont les mêmes pour un thread unique; il peut y avoir des langues/des implémentations où la valeur intermédiaire est géré différemment.If it's 0, I want to set it to 1, else set it to 0
qui ne disent pas explicitement que v doit être 0 ou 1 - valeur de départ peut être n'importe quel nombre)v = 1 - !!v
. C'est pire que lav = +!v
bien.v
de sorte que même pasv == 0
fonctionne...v ^= 1;
dans mon propre code. Il y a un problème de sécurité à prendre en compte: Siv
est statique, pas un booléen, et le programme s'exécute dans un environnement bruyant, il est possible (probable) que l'emplacement dev
dans la mémoire vive peut être endommagé de sorte quev
devient quelque chose d'autre que0
ou1
. Dans ces conditions, les OP du code ou @Quentin 's réponsev = (v ? 0 : 1);
serait plus robuste.v ^= 0;
ne change pas la valeur de la variable. Le^=
opérateur effectue un xor au niveau du bit, etx xor 0 == x
. À l'aide dev ^= 1;
fait un xor avec la valeur 1, donc en feuilletant le premier bit en v entre 0 et 1.v = 1 - v
est beaucoup plus claire quev = (v == 0 ? 1 : 0)
. Ce dernier est en fait un presque-d'obfuscation de l'écritureif (v == 0) { v = 1; } else { v = 0; }
.v = v ^ 1
. C'est le ou exclusif de l'opérateur. Voir: msdn.microsoft.com/en-us/library/0zbsw2z6%28v=VS.80%29.aspxv = 0
,v = 1 -v
=-1
pourquoi est-ce la réponse choisie?-1
, il est1
.v ^= 1;
pourrait être plus robuste contre les mauvaises entréev ^= 1 & v;
. Si je suis éveillé, le1 & v
sera assurez-vous que l'entrée est1
ou0
tandis que lev ^=
va faire la bascule comme vous l'avez conçu. Donc, la solution solide estv^=1&v
, bien que j'aime @Quentin estv=+!v
pour des arcanes de concision.Depuis
0
est unfalse
valeur et1
est untrue
valeur.Si vous êtes heureux d'utiliser
true
etfalse
au lieu de numéros deou si elles doivent être des nombres:
+
avant que!
. Ohhh qui ressemble tellement sale! mais cool :pswitch(v){ case 0 ...
ou if(v == 0) ou si v === 0. Vous êtes à la modification de son résultat, en plus de son approche....({v :+! v}).v
.+
signe! \_(ツ)_/v = (v ? 0 : 1)
aussi claire et idiomatiques JS.v
est endommagé et n'est plus une valeur de0
ou1
, il sera réaffecté une valeur valide.v = (v + 1) % 2
et si vous avez besoin de parcourir plus de valeurs il suffit de changer2
pour(n + 1)
. Dire que vous devez cycle 0,1,2 il suffit de nev = (v + 1) % 3
.const
variable à la place de la magie des nombres 2, 3, ...++v % 3
si vous voulez faire défiler 0, 1, 2Vous pouvez écrire une fonction pour l'utiliser comme:
v = inv(v)
inv
fonction :P)inv
être un nom descriptif?inv
mais vous pouvez utiliserinvert
outoggle
bien sûr, si vous le souhaitez. Mais parce que l'auteur a déclaré qu'il l'a écrit très souvent, j'ai pensé qu'il serait préférable de le garder court. Et en passant: ce comportement est vu assez souvent. Voir, par exemple, pythonlen
pour la détermination de la longueur d'une liste.function invert(d) { try { d /= d } catch(err) { return 1; } return 0; }
🙂!
de l'opérateur.Si vous n'avez pas de soins sur toute possibilité autre que 1:
Dans le cas ci-dessus, v, finissent par être 1 si v est 0, false, indéfini ou null. Prenez soin d'utiliser ce type d'approche - v sera de 0, même si v est "hello world".
v = v ? 0 : 1
.Lignes comme
v = 1 - v
, ouv ^= 1
ouv= +!v
va tous faire le travail, mais ils constituent de ce que je verrais comme hacks. Ce ne sont pas des belles lignes de code, mais pas cher des astuces pour avoir l'effet voulu.1 - v
ne communique pas de "basculer la valeur entre 0 et 1". Cela rend votre code moins expressif et introduit une place (même un petit), où un autre développeur d'avoir à analyser votre code.Au lieu d'avoir une fonction comme
v = toggle(v)
communique le but le plus rapide coup d'œil.v=1-v
ne communique pas la bascule?1-v
peut communiquer en effet de bascule, mais c'est que la seule chose qu'il communique. Par exemple, il peut également communiquer une ligne avec zéro àv=1
, ou une mise en miroir de la transformation centrée auv=0.5
. En ce sens, il est relativement ambiguë. Il est vrai que la connaissance quev
ne peut jamais être0
ou1
les limites de ses sens, mais que les forces d'autres développeurs (ou votre soi futur) à la compréhension de ce contexte avant d'être en mesure de comprendre cette simple ligne. Vous ne pouvez pas être beaucoup plus clair quev = toggle(v)
v=1-v
. Ce n'est pas une ligne de sir, c'est une bascule. Aller de l'avant et de nourrir quelques points à travers elle de voir pourquoi. Et gardez à l'esprit que, si vous êtes d'avoir des ennuis avec elle pour quelque raison que ce soit, pour la plupart d'entre nous, il est devenu un modèle en soi.v=1-v
est pas claire. Il est parfaitement clair si vous connaissez la valeur de v n'est jamais que l'une des deux valeurs, mais sinon, il semble sans rapport avec basculement. L'Op est à la recherche d'une méthode qui est la plupart du temps unambigious, si je suis l'évaluation de la question et des commentaires sur d'autres réponses correctement.v ^= 1
est parfaitement clair, si vous comprenez les opérations logiques, même si, qui vous avait mieux si vous êtes un programmeur. Je pense que c'est la différence entre cela etv=1-v
; l'autre est une opération logique et une opération arithmétique, et nous essayons de représenter un concept logique de ne pas mathématique.v ^= 1
est parfaitement clair pour les gens comme vous et moi. Je n'ai pas, cependant, toujours faire confiance à l'appui des développeurs qui seront la maintenance des logiciels en bas de la route. C'est souvent à leur profit que je vais soin de faire de code sans ambiguïté que possible (et de mon équipe de faire de même). J'ai vu certains choquante de l'ignorance qui se joue dans la mon temps.v ^= 1
a une certaine ambiguïté, même si, comme il peut être interprété comme un bit à bit-xor.v = 1 - v
je sais ce qu'il fait. Si je voisv = toggle(v)
je sais ce que c' à, si le programmeur et je partage la même idée de la signification du mot "bascule", et si la définition detoggle
n'est pas plein de bugs.v^=1
est beaucoup plus rapide, pour un novice programmeur, il ne clarifie pas ce qui se passe...v ^= 1
, où v est un seul bit de la valeur est la réponse.(De l'honnêteté et de mathématique de l'intégrité - étant donné le nombre de votes sur cette "réponse" - m'ont conduit à modifier cette réponse. J'ai tenu aussi longtemps que possible, car il a été conçu comme un petit boutade et non pas comme quelque chose de "profond" afin de mettre en toute explication semble à l'encontre du but. Cependant, les commentaires font qu'il est clair que je devrais être clair pour éviter les malentendus.)
Ma réponse originale à cette question:
La rédaction de cette partie du cahier des charges:
implique que la plupart de la solution exacte est:
D'abord, la confession: je ne obtenir mon delta fonctions confondues. Le delta de Kronecker aurait été légèrement plus approprié, mais pas par beaucoup comme je voulais quelque chose qui est indépendant du domaine (le delta de Kronecker est principalement utilisé seulement pour les entiers). Mais je ne devrais vraiment pas avoir utilisé les fonctions delta à tous, j'aurais dit:
Permettez-moi de clarifier. Rappelons qu'un fonction est un triple, (X,Y,f), où X et Y sont des ensembles (appelé le domaine et arrivée respectivement) et f est une règle qui affecte un élément de Y à chaque élément de X. Nous écrivent souvent le triple (X,Y,f) comme f: X → Y. Étant donné un sous-ensemble de X, dire Un, il y a un fonction caractéristique qui est une fonction χA: X → {0,1} (il peut également être considérés comme une fonction à une plus grande arrivée comme ℕ ou ℝ). Cette fonction est définie par la règle:
χA(x) = 1 si x ∈ A et χA(x) = 0 si x ∉ Un.
Si vous aimez la table de vérité, c'est la table de vérité de la question "Est l'élément x de X un élément du sous-ensemble Un?".
Donc, à partir de cette définition, il est clair que la fonction caractéristique est ce qui est nécessaire ici, avec X certains gros contenant 0 et A = {0}. C'est ce que je devrait ont écrit.
Et donc, pour les fonctions delta. Pour cela, nous avons besoin de savoir à propos de l'intégration. Soit vous connaissez déjà, ou vous n'avez pas. Si vous ne le faites pas, je ne peux rien dire ici de vous parler de la complexité de la théorie, mais je peux donner un résumé en une phrase. Un mesure sur un ensemble X est, par essence, "ce qui est nécessaire pour faire des moyennes de travail". C'est-à-dire que si nous avons un ensemble X et une mesure μ sur cet ensemble, puis il ya une classe de fonctions X → ℝ, appelé fonctions mesurables pour lesquels l'expression ∫X f dµ a du sens et est, dans un sens vague, la "moyenne" des f sur X.
Donné une mesure sur un ensemble, on peut définir une "mesure" pour les sous-ensembles de cet ensemble. Ceci est fait par l'affectation à un sous-ensemble de l'intégrale de sa fonction caractéristique (en supposant que c'est une fonction mesurable). Cette peut être infini ou indéfini (les deux sont légèrement différents).
Il y a beaucoup de mesures autour de, mais il y a deux qui sont importants ici. L'un est le mesure standard sur la ligne réelle, ℝ. Pour cette mesure, alors ∫ℝ f dµ est à peu près ce que vous obtenez enseigné à l'école (calcul est encore enseigné dans les écoles?): la somme des petits rectangles et de prendre de plus en plus petites largeurs. Dans cette mesure, la mesure d'un intervalle est sa largeur. La mesure d'un point est 0.
Une autre mesure importante, qui travaille sur les tout, est appelé le un point de mesure. Elle est définie de sorte que l'intégrale d'une fonction est le somme de ses valeurs:
∫X f dµ = ∑x ∈X f(x)
Cette mesure affecte à chaque singleton ensemble de la mesure 1. Cela signifie qu'un sous-ensemble a finis mesure si et seulement si elle est elle-même limitée. Et très peu de fonctions ont finis intégrale. Si une fonction a une durée intégrale, il doit être non nul uniquement sur un dénombrable nombre de points. Si la grande majorité des fonctions que vous le savez probablement n'avez pas fini de l'intégrale au titre de cette mesure.
Et maintenant pour les fonctions delta. Prenons une définition très large. Nous avons un espace mesurable (X,m) (si c'est un jeu avec une mesure sur elle) et un élément a ∈ X. Nous "définir" la fonction delta (selon un) à la "fonction" δa: X → ℝ avec la propriété que δa(x) = 0 si x ≠ a et ∫X δa dµ = 1.
Le fait le plus important à ce sujet pour obtenir un-tenir de est ceci: La fonction delta n'a pas besoin d'être une fonction. Il est pas correctement définis: je n'ai pas dit ce que δa(a) est.
Ce que vous faites à ce point dépend de qui vous êtes. Le monde se divise en deux catégories. Si vous êtes un mathématicien, vous dire ce qui suit:
Si vous n'êtes pas un mathématicien, vous dire ce qui suit:
Après avoir offensé mon public, je continuerai.
La delta de dirac est généralement pris à la fonction delta d'un point (souvent 0) dans la ligne réelle avec sa mesure standard. Donc ceux qui se plaignent dans les commentaires à propos de moi de ne pas savoir mon deltas le font parce qu'ils sont à l'aide de cette définition. Pour eux, je prie de m'excuser: même si je peux me soustraire à que par l'aide de la Mathématicien de la défense (comme popularisé par Humpty Dumpty: il suffit de redéfinir tout pour qu'il est correct), c'est mauvais pour utiliser un terme pour signifier quelque chose de différent.
Mais il y est d'une fonction delta qui fait faire ce que je veux faire, et c'est ce dont j'ai besoin ici. Si je prends un un point de mesure sur un ensemble X puis il y a est une véritable fonction δa : X → ℝ qui satisfait aux critères d'une fonction delta. C'est parce que nous sommes à la recherche pour une fonction X → ℝ qui est à zéro, sauf à un et telle que la somme de l'ensemble de ses valeurs est de 1. Une telle fonction est simple: la seule pièce manquante de l'information est sa valeur à un, et pour obtenir la somme à 1 nous venons de affectez-lui la valeur 1. Ce n'est autre que la fonction caractéristique sur {a}. Alors:
∫X δa dµ = ∑x ∈ X δa(x) = δa(a) = 1.
Donc dans ce cas, pour un singleton ensemble, les caractéristiques de la fonction et de la fonction delta d'accord.
En conclusion, il y a trois familles de "fonctions" ici:
La deuxième de ces est la plus générale, comme toutes les autres, en est un exemple lors de l'utilisation du point de mesure. Mais la première et la troisième ont l'avantage qu'ils sont toujours de véritables fonctions. Le troisième est en fait un cas particulier de la première, pour une famille de domaines (entiers, ou de certains sous-ensemble de celui-ci).
Donc, finalement, quand j'ai d'abord écrit la réponse que je n'était pas de penser correctement (je n'irais pas jusqu'à dire que j'ai été confus, comme je l'espère je viens de montrer que je ne sais de quoi je parle quand je pense en fait que d'abord, je ne pensais pas beaucoup). Le sens habituel de la fonction delta de dirac n'est pas ce qui est voulu ici, mais l'un des points de ma réponse a été que le domaine d'entrée a été pas défini de sorte que le delta de Kronecker aurait pas été juste. Ainsi, la meilleure mathématique réponse (que je visais) aurait été le caractéristique fonction.
J'espère que c'est clair du tout; et j'espère aussi que je n'ai jamais à écrire une mathématique de nouveau à l'aide d'entités HTML à la place de TeX macros!
\delta_a
. J'ai simplement transposé l'indice à un argument (depuis un indice est un argument en mathématiques). L'un des points de ma réponse a été que le domaine n'est pas défini et, par conséquent, qu'une fonction delta de sens.characteristic_function
c'est la même que l'écriture:v=magic(v);
. Cette réponse a échoué à faire de courtes et de solution claire à ce que l'OP a demandé.v=1-v;
est le meilleur à mon avis. Programmeur qui sait mathématiques bien est forte programmeur, mathématicien qui sait mathématiques bien est forte mathématicien.Vous pourriez faire
Le décrément de la valeur à 0 ou -1, et puis le
Math.abs
convertit -1 à +1.v = Math.round(Math.sin(Math.PI/(v+3)));
--
arrivera après que les effets secondaires de=
? (Dans ce cas, le résultat deMath.Abs()
serait touchée.) Je ne sais pas comment bien le javascript spec limite de l'ordre que des effets secondaires se produisent, je demande donc juste.javascript
, mais il a remarqué qu'avant que j'ai soumis. J'ai vérifié pour s'assurer que toutes les opérations étaient valides, mais aussi loin que l'ordre des opérations en js, je ne peux pas en être sûr.v = Math.round(Math.cos(Math.PI/((v*2+1)+2)-2*v));
😀v = Math.Abs(-v);
. Les effets secondaires de la--
confond tout simplement les choses.v = 1
puisv = Math.Abs(-1)
qui est de +1. Siv = 0
puisv = Math.Abs(-0)
est de 0.en général chaque fois que vous avez besoin de basculer entre deux valeurs , vous pouvez juste soustraire la valeur actuelle de la somme des deux bascule valeurs :
v
devient corrompu, il va soudainement commencer à basculer entre les deux valeurs différentes. (Juste une chose à prendre en considération...)v
est normalement utilisé pour exécuter alternativement deux états à partir d'une liste de trois ou plus, puis une corruption dev
pourrait provoquer le programme à exécuter alternativement deux types complètement différents états, ce qui pourrait entraîner des résultats inattendus et des résultats indésirables. La leçon à tirer de cela est la suivante: Toujours effectuer les contrôles de plausibilité sur vos données.Si elle doit être le nombre entier 1 ou 0, alors la façon dont vous le faites est correct, bien que les parenthèses ne sont pas nécessaires. Si ces derniers sont utilisés comme des booléens, alors vous pouvez simplement faire:
Est assez !
v = (v==0 ? 1 : 0);
". Tout le monde est de trouver des façons différentes de jouer au golf, et de ne pas répondre à la question. C'est pourquoi j'ai jusqu'-voté cette réponse.Liste de solutions
Il y a trois solutions que je voudrais proposer. Tous convertir toute valeur à
0
(si1
,true
etc.) ou1
(si0
,false
,null
etc.):v = 1*!v
v = +!v
v = ~~!v
et un autre, déjà mentionné, mais intelligent et rapide (bien que ne fonctionne que pour les
0
s et1
s):v = 1-v
Solution 1
Vous pouvez utiliser la solution suivante:
Ce sera d'abord convertir l'entier à l'opposé boolean (
0
àTrue
et toute autre valeur deFalse
), alors le traiter comme un entier lors de la multiplication par1
. Comme un résultat0
seront convertis en1
et toute autre valeur de0
.Comme une preuve voir ce jsfiddle et de fournir toutes les valeurs que vous souhaitez tester: jsfiddle.net/rH3g5/
Les résultats sont comme suit:
-123
seront convertis en entier0
,-10
seront convertis en entier0
,-1
seront convertis en entier0
,0
seront convertis en entier1
,1
seront convertis en entier0
,2
seront convertis en entier0
,60
seront convertis en entier0
,Solution 2
Comme mblase75 noté, jAndy a une autre solution qui fonctionne comme la mienne:
Il a également fait d'abord booléenne à partir de la valeur d'origine, mais utilise
+
au lieu de1*
de le convertir en entier. Le résultat est exactement le même, mais la notation est la plus courte.Solution 3
L'autre approche consiste à utiliser
~~
opérateur:Il est assez rare et toujours convertit un entier de type boolean.
+
pour le convertir en un nombre, afin de+!v
est équivalent à celui de votre solution (jAndy de la solution dans le cas des OP commentaires).1*
peut être remplacé par+
quand vous essayez de convertir booléen en entier. Tout le reste de ma réponse reste la même. jAndy réponse est bonne, mais le mien est plus détaillée. Je vais ajouter sa solution à ma réponse.Pour résumer une autre réponse, un commentaire et ma propre opinion, je suggère la combinaison de deux choses:
Ici est la fonction qui vous pourriez placer dans une bibliothèque ou peut-être de l'envelopper dans un Plugin pour un autre Framework Javascript.
Et l'utilisation est simple:
Les avantages sont:
function toggle(i){ return i == 0 ? 1 : 0 }
?Je ne sais pas pourquoi vous voulez construire votre propre booléens? J'aime le funky syntaxes, mais pourquoi ne pas écrire compréhensible code?
Ce n'est pas le plus court/plus rapide, mais la plus la plus claire (et lisible pour tout le monde) est à l'aide de la bien connue, si/d'autre état:
Si vous voulez être vraiment clair, vous devez utiliser l'opérateur booléen au lieu de numéros pour cela. Ils sont assez rapides pour la plupart des cas. Avec les booléens, vous pouvez simplement utiliser cette syntaxe, qui va gagner dans la brièveté:
=== 0
. Avec d'entrée d'échantillon de7
, le bon de sortie est0
, mais ce sera de sortie1
.Une autre forme de votre solution originale:
EDIT: Merci TehShrike et Guffa pour souligner l'erreur dans ma solution originale.
'opacity:'+true
et vous vous retrouvez avecopacity:true
au lieu deopacity:1
.Je voudrais le rendre plus explicite.
Ce n'
v
veux dire?Par exemple lorsque v est de l'état. Créer un Statut de l'objet. En DDD un objet de valeur.
Mettre en œuvre la logique de cet objet de valeur. Ensuite, vous pouvez écrire votre code dans un plus fonctionnelle qui est plus lisible. État de commutation peut être fait par la création d'un nouveau Statut sur la base de l'état actuel. Si votre déclaration /logique est ensuite encapsulé dans votre objet, vous pouvez unittest. Un valueObject est immuable, de sorte qu'il n'a pas d'identité. Donc, pour en changer la valeur, vous devez créer un nouveau.
Exemple:
Une autre façon de faire:
Cela est manquant:
Il fonctionne comme round robin ainsi:
Ou
Le charme de la dernière solution, il fonctionne avec toutes les autres valeurs.
Pour un cas très spécial, comme un (changer) de la valeur et de
undefined
, ce modèle peut être utile:Juste pour le plaisir:
v = Math.pow(v-1,v)
aussi, qui bascule entre 1 et 0.Un de plus:
v=++v%2
(en C, il serait simple
++v%=2
)ps. Ouais, je sais que c'est double affectation, mais c'est juste cru réécriture de C de la méthode (qui n'est pas le travail, cause JS pré-opérateur d'incrémentation ne marche pas retour lvalue.
++
opérateur (ce n'est pas une lvalue). Comme pourv=++v%2
, vous êtes à la modification dev
deux fois. Je ne sais pas si c'est bien définie dans le code JavaScript , mais il n'est pas nécessaire.v = (v+1) % 2
.c++
il est - en raison de la pré-incrémentation de l'opérateur a une plus grande priorité et modifie la variable "en place", de sorte qu'il peut être utilisé comme lvalue. Je pense que JS mise en œuvre de++
est telle qu'il ne peut pas être traitée comme une lvalue:/ Et oui, c'est redondant, mais j'essayais de ne montrer qu'une autre méthode, il y a déjà posté meilleure des solutions 🙂Si vous avez la garantie de votre entrée est un 1 ou un 0, alors vous pourriez utiliser:
définir un tableau{1,0}, set v à v[v], donc v avec une valeur de 0 devient 1 et vica versa.
Puisque c'est du JavaScript, on peut utiliser l'unaire
+
convertir int:Ce sera logique
NOT
la valeur dev
(donnanttrue
siv == 0
oufalse
siv == 1
). Puis nous convertir renvoyées valeur booléenne dans son entier correspondant à la représentation.Une autre façon créative de faire, avec
v
étant égal à une valeur quelconque, retournera toujours0
ou1
!!
résultat en rien dans la logique, les mathématiques, vous pouvez mettre!!!!
dans et il sera même mais en conséquence, les 4 opérations unneed!!(1) === true
et!!(0) === false
v = Boolean(v^1)
serait plus d'information, merci pour l'explication - je n'ai pas pensé sur le casting!
sera de voter pour elle en booléen. L'ajout d'un autre!
va nier que booléenne. Le casting est implicite ici, et le résultat final. Il n'est pas nécessaire pour le -1.Si possible, les valeurs de v sont seulement des 0 et des 1, alors pour tout entier x, l'expression:
v = Math.pow((Math.pow(x, v), x), v);
permet de basculer entre la valeur.
Je sais que c'est un vilain solution et l'OP n'a pas été à la recherche pour cela...mais je pensais juste à une autre solution, quand j'étais dans les toilettes 😛
Pas testé, mais si vous êtes après un booléen je pense que
var v = !v
fonctionne.Référence: http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables
de travail pour v=0 et v=1; et de passer à l'état;
Si il y a juste deux valeurs, comme dans ce cas(0, 1), je crois que c'est un gaspillage d'utiliser int. Plutôt aller pour les booléens et de travail en bits. Je sais que je suis en supposant mais dans le cas de basculer entre deux états booléens semble être le choix idéal.
Bien, Comme nous le savons qu'en javascript uniquement que Booléenne comparaison permettra également de vous donner le résultat escompté.
c'est à dire
v = v == 0
est assez pour cela.Ci-dessous est le code pour que:
JS:
JSFiddle: https://jsfiddle.net/vikash2402/83zf2zz0/
En espérant que cela vous aidera 🙂
true
etfalse
. Vous pouvez utiliserv == 0
pour déterminer la valeur de la variable dans une condition, mais si vous voulez utiliser la valeur 0 ou 1, vous devez utiliser quelque chose commev == 0 ? 0 : 1
ouNumber(v)
pour l'obtenir. (Vous pouvez aussi utiliserv = !v;
pour basculer entretrue
etfalse
.)Il sera de type cast l'inversion de la valeur Booléenne en Nombre, qui est le résultat souhaité.
en multipliant par 1 pour activer la fonction booléenne dans le nombre