Aller au contenu

Comparaison binaire en LUA


MAM78

Recommended Posts

J'ai une donnée qui contient un variable "A" de type binaire pouvant contenir les valeurs suivantes, sachant que ces valeurs peuvent être combinées :

1

2

4

8

...

 

Je cherche comment en LUA est-ce que l'on fait pour faire une comparaison binaire du type :

  • si A contient 3 cela veut dire que la comparaison binaire est vraie pour 1 et 2
  • si A contient 4 cela veut dire que la comparaison binaire est vraie pour 4
  • si A contient 12 cela veut dire que la comparaison binaire est vraie pour 4 et 8
  • si A contient 7 cela veut dire que la comparaison binaire est vraie pour 1, 2 et 4
  • ...

 

Quelle est la syntaxe en LUA pour faire le test de comparaison binaire ?

 

Modifié par MAM78
Lien vers le commentaire
Partager sur d’autres sites

Il y a des codes tout faits qui existent sur Google.... pour manipuler les bits

 

Voici quelques uns de ceux que j'utilise dans mes VD/scènes :

-- Convert Decimal to Bits, most significant first
toBits = function(self, num, bits)
	bits = bits or select(2, math.frexp(num))
	local t = {}  -- will contain the bits
	local b
	for b = bits, 1, -1 do
		t[b] = math.fmod(num, 2)
		num = (num - t[b]) / 2
	end
	if #t == 0 then t = {0} end
	return table.concat(t)
end,


--
-- Bitwise AND
--
local function bitAND(a, b)
	local p,c=1,0
	while a and a>0 and b and b>0 do
		local ra,rb=a%2,b%2
		if ra+rb>1 then c=c+p end
		a,b,p=(a-ra)/2,(b-rb)/2,p*2
	end
	return c
end

 

Lien vers le commentaire
Partager sur d’autres sites

Décidément, je suis vraiment un neuneu ;)

 

Je n'arrive pas à utiliser ton code. Ceci mon test :

 

-- Convert Decimal to Bits, most significant first
toBits = function(num, bits)
	bits = bits or select(2, math.frexp(num))
	local t = {}  -- will contain the bits
	local b
	for b = bits, 1, -1 do
		t[b] = math.fmod(num, 2)
		num = (num - t[b]) / 2
	end
	if #t == 0 then t = {0} end
	return table.concat(t)
end

BitAND = function (a,b)--Bitwise and
    local p,c=1,0
    while a>0 and b>0 do
        local ra,rb=a%2,b%2
        if ra+rb>1 then c=c+p end
        a,b,p=(a-ra)/2,(b-rb)/2,p*2
    end
    return c
end

a=toBits(1,8)
b=toBits(3,8)

fibaro:debug("aaa"..a.."aaa")
fibaro:debug("bbb"..b.."bbb")

fibaro:debug("***"..bitAND(a, b).."***")

if bitAND(a, a) then
  fibaro:debug("xxx")
else
  fibaro:debug("zzz")
end

 

J'obtiens ça :

 

[DEBUG] 19:20:37: nil
[DEBUG] 19:20:37: Nom :{"pathAuth":"auth.cgi","435":{},"SceneID":105,"pathCamera":"entry.cgi","434":{},"pathRecord":"entry.cgi"}
[DEBUG] 19:20:37: 2018-12-18 19:20:37.355146 [ fatal] Unknown exception: /opt/fibaro/scenes/106.lua:18: bad argument #1 to 'pairs' (table expected, got string)

 

C'est quoi STP le problème ?

 

Lien vers le commentaire
Partager sur d’autres sites

Désolé, je sens un agacement dans tes retours ces derniers temps.

 

Effectivement, je n'ai pas ton expertise, c'est pourquoi j'y fais appel comme aux autres membres du forum.

 

Mais quoi qu'il en soit, j'essaye toujours d'apprendre des autres et je partage autant que possible ma production et mon expérience.

 

Sur le forum, j'ai rien trouvé sur BitAND et sur Google pas mieux. Pourtant, j'ai beau chercher, probablement très mal, mais pour le moment je ne comprends pas comment utiliser la fonction BitAND dans le cadre de mon besoin.

 

Mon besoin me semblait relativement simple, c'est de pouvoir comparer 2 valeurs et savoir si la comparaison binaire est true ou false. J'entends :

  • 1 and 1 => true
  • 2 and 1 => false
  • 3 and 1 => true
  • 4 and 1 => false
  • 4 and 2 => false
  • ...

Si quelqu'un à le courage de m'aider, merci d'avance :13:

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Ok, je pense avoir compris tout seul comme un grand si la fonction retour un nombre > 0 c'est vrai.

 

Comme dit l'adage, on n'est jamais si bien servi que par soi-même ou aide toi le ciel t'aidera ;) Mais le ciel, ce n'est pas un dieu du forum :98: j'en suis pas encore là.

 

Lien vers le commentaire
Partager sur d’autres sites

Désolé, mais en ce moment, je ne fait pas du tout de LUA, et ce depuis des mois... par manque de temps, d'envie, et de besoin. En effet, en règle générale je ne fait pas de programmation par plaisir (même si j'aime un peu ça quand même), mais pour répondre à un besoin précis.

Donc si je n'en fait pas pour moi, très honnêtement, je risque encore moins d'en faire pour les autres. N'y vois pas une attaque personnelle.

J'essaye juste de t'aiguiller.

 

Le code de ces 2 fonctions ne vient pas de moi, il a été trouvé sur Google, mais je ne saurais te dire quels termes j'ai utilisé pour la recherche.

L'une des 2 fonctions provient de la scène MusicCast que tu as décortiqué, donc tu y trouveras un exemple d'utilisation.

L'autre provient de la librairie SNMP utilisée dans le VD pour l'onduleur Eaton, dispo également sur le forum.

Lien vers le commentaire
Partager sur d’autres sites

il y a 1 minute, MAM78 a dit :

on n'est jamais si bien servi que par soi-même

Voilà, c'est en cherchant et en expérimentant qu'on apprend, qu'on progresse, qu'on acquiert les bons réflexes.

 

Je ne suis absolument pas développeur, je n'ai aucune expérience pro, comme peuvent l'avoir des développeurs talentueux comme Krikroff et Steven.

Je ne fait que copier des bouts de codes trouvés ça et là, un peu de colle pour assembler le tout, et beaucoup, vraiment beaucoup de temps, justement parce que je pars de 0.

Lien vers le commentaire
Partager sur d’autres sites

J'ai un passé de développement, mais jamais en LUA, donc là j'apprends. J'ai probablement des réflexes qui dates un peu ;).

 

Mais tu sais, on part tous de 0 un jour. Rien est inné tout s'apprend avec le temps, même si l'on a chacun nos limites :(.

 

Je suis actuellement sur un DEV qui capitalise beaucoup sur tes bouts de codes. Je le mettrais évidement à disposition des membres du forum en espérant qu'il soit utile et complémentaire à ce qui existe déjà.

 

A suivre dans un prochain nouveau TUTO, ..........

 

Modifié par MAM78
Lien vers le commentaire
Partager sur d’autres sites

Pour le LUA, je pense qu'on a tout découvert ce langage avec la HC2, donc égalité pour tout le monde.
Par contre, la programmation requiert une certaine logique, il est vrai que nous n'avons pas tous le neurone orienté dans la même direction : certains sont plus scientifiques, d'autres plus littéraire. Perso la littérature je n'y ai jamais rien compris (2/20 au BAC en Philo............ donc tu vois mon niveau.... tiens d'ailleurs @jojo tu ajouteras cela sur ta liste ;)), par contre, des maths, j'en ai bouffé jusqu'à plus soif.

Donc il reste forcément des traces, une bonne dose de logique, et c'est ce dont on a besoin pour la programmation. Le langage utilisé importe peu, que ça soit du Basic, du C, ou du LUA, c'est plus ou moins pareil (bon évidemment, certains langages sont plus simples que d'autres.... tiens un exemple concret qui m'a marqué, essaye de tracer une simple ligne droite à l'écran en assembleur, tu vas comprendre ta douleur... et la nécessité d'avoir étudié les mathématiques).

 

Bref, j'ai partagé beaucoup de code sur le forum, mais pas tout (par manque de temps, ou parce que ce n'est pas partageable (nécessiterait trop de support derrière, on en revient au problème du manque de temps)), je peux aiguiller les copains forumeurs dans la bonne direction, mais par écrire du code à la place.

 

Et puis comme le dis le proverbe, "Si tu donnes un poisson à un homme il mangera un jour; si tu lui apprends à pêcher, il mangera toujours", alors je rends service :D

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Il y a 1 heure, Lazer a dit :

découvert ce langage avec la HC2, donc égalité pour tout le monde.

Pas totalement, au départ peut-être mais aujourd'hui tu as au moins 3 ans d'avance sur moi ;)

 

Il y a 1 heure, Lazer a dit :

une bonne dose de logique, et c'est ce dont on a besoin pour la programmation

En ce qui me concerne, mon niveau de math et de logique ne m'auraient en aucun cas permit d'écrire le code de la fonction BitAND ci-dessous :

local function bitAND(a, b)
	local p,c=1,0
	while a and a>0 and b and b>0 do
		local ra,rb=a%2,b%2
		if ra+rb>1 then c=c+p end
		a,b,p=(a-ra)/2,(b-rb)/2,p*2
	end
	return c
end

Comme quoi, nous ne sommes pas tous à égalité en LUA ou autres languages :huh:

Modifié par MAM78
Lien vers le commentaire
Partager sur d’autres sites

Moi non plus, mais si tu regardes bien, ce ne sont que des maths permettant de manipuler des bits (*), c'est à dire un système de numération en base 2. C'est très simple en fait (ou pas). La base de tout cela, ce sont les portes logiques qu'on a appris en cours de physique du lycée.

D'ailleurs, à le regarder, et sans même chercher à le comprendre, je trouve ce code bien trop compliqué.... Il est certainement possible de faire plus simple (mais comme dit, je l'ai juste copié/collé)

En langage C, qui est un langage bien trop primitif au gout de bien des développeurs d'aujourd'hui, ça se fait pourtant en 1 seule ligne !

 

 

(*) Tiens d'ailleurs en parlant de manipulation de bits (j'en vois au fond de la classe qui rigolent), il suffit de chercher "lua bit manipulation" sur Google, ce qu'il traduit en "bitwise operations", et là, des tonnes d'exemples s'offrent à toi.

Lien vers le commentaire
Partager sur d’autres sites

il y a 10 minutes, Lazer a dit :

des tonnes d'exemples s'offrent à toi.

Parmi ces tonnes, un grand nombre de liens font références au language LUA en version 5.3 qui me semble ne pas être la base de que nous propose Fibaro, d'où la nécessité de passer par des bouts de codes qui complexifiés nos DEV.

J'en parlais pas plus tard qu'hier sur la non disponibilité des fonctions Net.FHttp dans les scènes et qui nous oblige là encore à complexifier. Mais peut-être que l'acquisition par les italiens va faire évoluer la donne, mais j'en doute.

Lien vers le commentaire
Partager sur d’autres sites

Ah bah oui, j'ai eu une formation technique !

 

Là tu es de mauvaise foi (ou tu n'as pas le courage de chercher :P )
3ème lien, sur StackOverflow, on retrouve justement la fonction BitAND() que j'ai honteusement copié.

Ainsi que tous les autres opérateurs de manipulation de bits :

https://stackoverflow.com/questions/5977654/lua-bitwise-logical-operations

Oui bon, le LUA de Fibaro est limité, on le sait.... mais justement on trouve des solutions.

Pour Nice, je pense en effet qu'il ne mettront pas leur nez dans le LUA.

 

Ah oui, et au fait, j'ai eu une formation Google, en 1999, enfin pardon, une présentation marketo-commerciale de Google, startup qui prétendait remplacer le célèbre Altavista.... j'étais loin de ma douter de la suite.... je ne sais pas pourquoi, mais je me souviens encore à quelle place j'étais assis dans la salle, faut croire que ça m'a marqué !

Quoi qu'il en soit, savoir chercher sur Google est plus important que savoir tout court. Souviens toi, l'histoire du pêcheur.... ;)

Internet est un formidable outil :) J'ai même appris à bricoler grâce à Internet.... enfin Google.... enfin Youtube.... et pourtant, il y a 10 ans, je n'aurais jamais cru cela possible.... bah si, tout est possible, Internet est un formidable outil d'apprentissage. Je divague, mais mon propos est toujours le même, on peut tout apprendre si on se donne la peine de chercher.

Lien vers le commentaire
Partager sur d’autres sites

Chercher c'est bien, mais comme tu sais le temps c'est de l'argent et chercher des heures, ce n'est pas très productif. D'autant que cela nous laisse encore moins de temps pour nous occuper de nos êtres chères.

 

Dans nos entreprises, notamment chez les ESN, nous apprenons aussi à nos jeunes à s'entraider et demander aux autres de les orienter pour ne pas perdre en efficacité tout en favorisant le travail collaboratif et l'emergence de nouvelles idée et de nouveau tallants.

 

Le monde a bien évolué, il est loin le temps où lorsque l'on se posait une question, on allait chercher l'encyclopédie universalisis pour y trouver des réponses et y apprendre à pêcher. Je sais je pousse le bouchons un peu loin :P

 

C'est ça aussi le monde 2.0 et même 3.0.

 

Parfois un petit coup de main, ne serait-ce qu'une minute ça donne un peu de courage aux bonne initiatives et l'on se sent un peu moins seul devant son écran.

 

C'est essence même d'un tel Forum. Sinon à quoi bon nous y retrouver ;)

 

Modifié par MAM78
Lien vers le commentaire
Partager sur d’autres sites

Et c'est bien ce qu'on fait.

Mais il y a une différence entre aider et faire à la place :)

 

C'est marrant, mon ESN est un mauvais exemple, c'est hyper individualiste, aucune entraide, aucune formation non plus, chacun ne regarde que son nombril, justement je viens de démissionner, mais chut....

Lien vers le commentaire
Partager sur d’autres sites

il y a 3 minutes, Lazer a dit :

Mais il y a une différence entre aider et faire à la place :)

Tu abuses quand même. Ce n'était pas ma demande.

 

il y a 4 minutes, Lazer a dit :

C'est marrant, mon ESN est un mauvais exemple, c'est hyper individualiste, aucune entraide, aucune formation non plus, chacun ne regarde que son nombril, justement je viens de démissionner, mais chut....

Comme quoi, n'y aurait-il pas une relation de cause à effets. Malgré mon age certain, j'ai encore l'utopie de croire encore à la collaboration, le partage et l'intelligence collective.

Lien vers le commentaire
Partager sur d’autres sites

Je sais pas, c'est déjà signé en tout cas :)

 

Pour avoir fait une UV de Knowledge Management quand j'étais étudiant, puis avoir travaillé sur un outil de partage de connaissance, et en avoir utilisé plein d'autres, je t'avoue que je suis totalement désabusé sur ce sujet.

Très rares sont les entreprises à avoir réussi à mettre en place quelque chose qui tient la route.... c'est pas faute d'essayer, mais soit les outils ne sont pas adaptés, soit l'usage qui en est fait est mauvais, et ça tombe souvent aux oubliettes, donc les collaborateurs se débrouillent comme ils peuvent.

Dans ma boite, on n'a même pas un modèle de document, donc déjà ça commence très mal !!! Donc chaque client reçoit des docs différentes des différents intervenants du projet.

Perso je produis beaucoup de docs (c'est le cas aujourd'hui d'ailleurs....) pour les clients, et la plupart les perdent, seulement 1% prend le temps de les relire, et parfois ils me demandent quelques mois plus tard de leur envoyer à nouveau la doc !!! Donc tu vois, le problème est généralisé....

 

J'en reviens à Internet et Google du coup, car même si l'information est dispersée partout (forums, blogs, etc...), on dispose d'un super moteur de recherche pour trouver n'importe quelle info. Justement ce qui n'existe pas en entreprise... les documents finissant dans une base documentaire propriétaire, une boite email, une archive, un répertoire du disque dur perso, une clé USB, etc....

 

Au final, "la collaboration, le partage et l'intelligence collective", ça ne fonctionne que quand les collaborateurs veulent bien s'en donner la peine... ça ne fonctionne pas dans toutes les boites ça.

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...