Behöver hjälp med bitoperationer

Permalänk
Medlem

Behöver hjälp med bitoperationer

Jag skulle behöva hjälp med lite bitoperationer.

Jag har behov av tre olika värden med lite speciella egenskaper.

Ett värde skall vara 0, det är inte så klurigt.

Däremot så skall ett andra värde vara möjlig att tillsammans med en bitoperator och det första värdet bli den andra. Exempelvis om den andra mängden är 3, så blir 3 | 0 (3 or 0) 3.

Det tredje värdet skall vara mindre än det andra, och ha den egenskapen att det tillsammans med samma bitoperator behålla sitt ursprungsvärde. Exempelvis 7 | 3 (7 or 3) blir 7.

Hittils har jag använt 0 3 och 7, men det tredje värdet behöver vara mindre än det andra.

Det spelar ingen roll vilken operator det är som används, and, or, eller xor, bara det är samma.

Någon som kan komma på tre värden och en operator som passar på ovanstående?

Visa signatur

Fractal Design Define R3 | Asus Z170 Pro Gaming | Intel Core i7 6700K | 32 GB Corsair Vengaeance LPX DDR4 2666 MHz | Asus Radeon RX 580 | EVGA SuperNova 850 G2 | Kingston A400 480 GB SSD | 2 x WD Caviar Black 1TB | 2 x Crucial MX500 500 GB SSD

Permalänk
Glömsk

Kan det tredje värdet vara 0?

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Nej, det tredje måste vara skilt från det första, m a o > 0.

Visa signatur

Fractal Design Define R3 | Asus Z170 Pro Gaming | Intel Core i7 6700K | 32 GB Corsair Vengaeance LPX DDR4 2666 MHz | Asus Radeon RX 580 | EVGA SuperNova 850 G2 | Kingston A400 480 GB SSD | 2 x WD Caviar Black 1TB | 2 x Crucial MX500 500 GB SSD

Permalänk
Medlem

0, 3 och 2 eller 0, 3 och 1?
0 | 3 = 3
3 | 2 = 3 resp 3 | 1 = 3
eller fattade jag fel?

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Decimalt:
0 | 1 = 1
1 | -1 = -1

Binärt:
0...000 | 0...001 = 0...001
0...001 | 1...111 = 1...111

Tja, åtminstone om man använder tvåkomplement representation av negativa tal.

Permalänk
Medlem

jovnas: Nja, det blir inte som jag tänkt mig.

Om vi kallar talen a, b och c, så skall följande gälla (? är valfri bitoperator, dock samma operator i alla fall):

a = 0
b > a
a < c < b

a ? b = b
b ? b = b
b ? c = c

Men det kanske är omöjligt att hitta en sådan uppsättning tal?

Visa signatur

Fractal Design Define R3 | Asus Z170 Pro Gaming | Intel Core i7 6700K | 32 GB Corsair Vengaeance LPX DDR4 2666 MHz | Asus Radeon RX 580 | EVGA SuperNova 850 G2 | Kingston A400 480 GB SSD | 2 x WD Caviar Black 1TB | 2 x Crucial MX500 500 GB SSD

Permalänk
Medlem

Som jag ser det så får du nog skriva dom funktionerna själv.
Om jag hade gjort denna funktion så skulle jag nog kört med a b och c som vanliga boolean samt skickat med en extra parameter till funktionen som talar om vilket tal område det är som gäller...Vet inte om det funkar i praktiken men det kan ju vara värt ett försök.

EDIT:
Kom just på en sak. Jag kanske inte riktigt fattat vad det är du vill ha...men om du tex vill göra
a | b | c och a = 0 b = 3 och c =7 så ska den retunera 7 ?
är det korrekt?
iså fall borde det gå att definera den som max av a b och c.
likadant borde gälla för a & b & c den kan du defineras som min av a b och c.

Visa signatur

Flest prylar när man dör vinner

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av Bergling
jovnas: Nja, det blir inte som jag tänkt mig.

Om vi kallar talen a, b och c, så skall följande gälla (? är valfri bitoperator, dock samma operator i alla fall):

a = 0
b > a
a < c < b

a ? b = b
b ? b = b
b ? c = c

Men det kanske är omöjligt att hitta en sådan uppsättning tal?

I ditt första inlägg skriver du: "Däremot så skall ett andra värde vara möjlig att tillsammans med en bitoperator och det första värdet bli den andra"

a ? b = b
b ? b = b
b ? c = c

ska väl då vara

a ? b = b
b ? a = b
b ? c = c

Här har du lite kod att bruteforcea fram en lösning:

bool testbit(int a, int b, int c) { if((a&b) == b && (b&a) == b && (b&c) == c) return true; if((a|b) == b && (b|a) == b && (b|c) == c) return true; if((a^b) == b && (b^a) == b && (b^c) == c) return true; return false; }

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Vad jag har är en stor matris med två olika typer av värden (a och b). Helt enkelt en stor bitmap. För enkelhetens skull antar vi att dessa värden är 0 och 1.

Denna vill jag traversera på så sätt att jag markerar en punkts omgivande punkter genom att göra en bit-operation på dessa. De skall då anta värdet c. (c ? a -> c)

Eftersom jag kommer att befinna mig nära punkter med värdet b, men inte vill att dessa skall förändras när jag gör min bitoperation, skall även b ? c -> c gälla.

b skall dessutom vara störren än c.

Anledningen till att c skall vara större är att jag vill summera en punkts omgivande värden, och då skall det inte "kosta" mer för en punkt att ligga nära kanten. Sedan skall de punkter med ett sammanlagt "värde" som underskrider en viss nivå plockas ut.

Rörde jag till det ännu mer nu kanske?

Visa signatur

Fractal Design Define R3 | Asus Z170 Pro Gaming | Intel Core i7 6700K | 32 GB Corsair Vengaeance LPX DDR4 2666 MHz | Asus Radeon RX 580 | EVGA SuperNova 850 G2 | Kingston A400 480 GB SSD | 2 x WD Caviar Black 1TB | 2 x Crucial MX500 500 GB SSD

Permalänk
Medlem

Kan du ge lite tydligare exempel på vad det är för slags indata du förväntar dig och vad du vill ha för utdata. Kanske till och med vad det är du försöker göra

Visa signatur

"Anyone who puts a small gloss on a fundamental technology, calls it proprietary, and then tries to keep others from building on it, is a thief."
-Tim O'Reilly "http://iiice.net/~ice/stuff/secret_msg.wav" - who?

Permalänk
Medlem

Då säger att detta ska gälla:
a ? b = b
b ? b = b
b ? c = c

Men behöver omvänt gälla, dvs:
b ? a = b
b ? b = b
c ? b = c

Permalänk
Glömsk

Är det till veckans problem 3?

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Jag har hittat en formel som uppfyller

a = 0
b > a
a < c < b

a ? b = b
b ? a = b
b ? b = b
b ? c = c
c ? b = c

Låt:
a=0
b=3
c=1

svar=((x+y)&3)|1

där x och y är indata, svar är utdata, & är bitvis OCH, | är bitvis ELLER (inte XOR)

Jag vet inte om det är det du söker eftersom det är flera operationer

Permalänk
Medlem

Psionicist: Ja det är till veckans problem.

Det handlar helt enkelt om att jag har en matris med tal.

Dessa värden är 0 om det är tomt eller 1 (eller egentligen godtyckligt värde > 0) om det är ifyllt. Vi kan kalla detta tal för x.

Det jag vill göra är helt enkelt att jag för en godtycklig punkt (som inte har värdet x, alltså ej ifyllt), vill utföra en bitoperation på punktens kringliggande punkter (8 stycken). Det jag vill är att om det är så att en kringliggande punkt från början har värdet 0, så skall den få värdet y. Har den redan värdet y, så skall inte värdet förändras. Det gäller också att y > x.

Vidare gäller att om en kringliggande punkt har värdet x, så skall värdet förbli x även efter operationen.

Bitoperationen är valfri, men man skall alltså kunna tillämpa samma operation

Man kan likna det vid en bild, där vitt är "tomt" och rött är "ifyllt". I denna bild vill jag måla runt en godtycklig vit punkt, med en annan färg, t ex blått. Men om jag försöker måla blått i en röd punkt, så skall det fortfarande vara rött.

Det är möjligt att det inte går att lösa med uppställda kriterier, så sitt inte uppe hela natten och slit erat hår i onödan...:)

Visa signatur

Fractal Design Define R3 | Asus Z170 Pro Gaming | Intel Core i7 6700K | 32 GB Corsair Vengaeance LPX DDR4 2666 MHz | Asus Radeon RX 580 | EVGA SuperNova 850 G2 | Kingston A400 480 GB SSD | 2 x WD Caviar Black 1TB | 2 x Crucial MX500 500 GB SSD