À la recherche pour .NET de Mathématiques de la méthode qui est mise à zéro d'un nombre entier négatif
Un concept similaire aux Mathématiques.Abs() - je suis à la recherche d'une fonction qui à un entier positif sera de retour le même entier. Si négatif, sera de retour à zéro.
Donc:
f(3) = 3
f(0) = 0
f(-3) = 0
Oui, c'est assez simple à écrire sur mon propre mais je me demandais si l' .NET la classe de Mathématiques a déjà construit dans cette ou si le même effet peut être obtenu par savamment enchaînant un peu de Mathématiques.* appels?
- Duh. Merci les gars. J'ai bien évidemment de ne pas passer assez de temps dans les Mathématiques.*
Vous devez vous connecter pour publier un commentaire.
Il est appelé
Math.Max
:Cela semble être ce que vous voulez, non?
Je pense que
est ce que vous voulez.
Il semble que les Mathématiques.Max est le chemin à parcourir, mais ce serait trop de travail... 😉
Mathématiques.Max est le meilleur, mais sans en Mathématiques et en VB
Donnée de 32 bits entier signé
num
, l'expression suivante renvoie zéro s'il est négatif, ou l'original inchangé valeur autrement:(~num >> 31) & num
Cette opération est parfois appelé de serrage; les valeurs inférieures à zéro sont serré à zéro.
Explication
Uniquement des entiers positifs (et zéro) ont
0
pour leur bit de signe, qui est le plus à gauche, ou "bit" (un.ka., "MSB"). Considérons la version 32 bits de cas. Depuis peu, les positions sont numérotées de gauche à droite en commençant par 0, le bit de signe est "bit 31". En feuilletant ce bit et puis se propageant à chacune des 31 autres positions de bits, vous obtenez un résultat où:0xFFFFFFFF
,-1
), ou0x00000000
,0
).Par masquage la valeur d'origine de ce résultat, vous avez remis à zéro la valeur, mais seulement si elle est négative à l'origine.
Remarques
Depuis
&
(au niveau du bit-AND
) a une très faible priorité, dans C#, vous aurez généralement à l'entourent ces expressions extérieur des parenthèses:Si
num
est unsigned (par exemple,uint ui
), vous devez utiliser une fonte à assurez-vous que le changement est signé. Ceci est appelé un droite décalage à, et il assure que le MSB est dupliqué dans chaque rightwards changement de position:Pour les valeurs de 64 bits, changement de 63 bits au lieu de 31:
Comme indiqué, vous devez utiliser le
~
(au niveau du bit-NOT
) opérateur pour inverser le bit de signe. Si vous tentez d'utiliser "unaire moins"-
au lieu de cela, vous obtiendrez une réponse incorrecte pour la valeur0x80000000
parce que c'est l'une de deux valeurs de type entier qui est pas touchés par l'application du signe moins pour elle. (L'autre est égale à zéro, mais il arrive à travailler correctement de toute façon). Au niveau du bit-NOT
, d'autre part, c'est la garantie pour inverser tous les bits de tout/chaque valeur.Si vous êtes pressé, voici quelques testé les méthodes d'extension, prêt à copier/coller:
en Savoir plus sur la non-ramification code!
Cet exemple de code fourni ci-dessus est l'un des plus simples peu-tourner exemples qui démontre sans branches code. Si vous n'êtes pas familier avec elle, le terme fait généralement référence à une grande variété de micro-techniques d'optimisation qui tentent de minimiser les branches conditionnelles dans le code de l'utilisateur, afin de réduire les erreurs de prédiction des stands dans le PROCESSEUR pipeline.