När man skifter åt vänster är det ingen skillnad mellan aritmetisk och logisk växling. När du växlar rätt, beror typen av växling på typen av värdet som förskjuts. (Som bakgrund för de läsare som är obekanta med skillnaden, skiftar en logisk högerförskjutning med 1 bit alla bitarna till höger och fyller in längst till vänster med en 0. Ett aritmetiskt skifte lämnar det ursprungliga värdet i den vänstra biten. Skillnaden blir viktig när man hanterar negativa tal.) När man byter ett osignerat värde är operatören i C en logisk växling. När man skifter ett signerat värde är operatören ett aritmetiskt skifte. Till exempel antar en 32 bitars maskin: svarat 11 aug 08 kl 9:16 Så nära, Greg. Din förklaring är nästan perfekt, men att ändra ett uttryck för signerat typ och negativt värde är implementeringsdefinierat. Se ISOIEC 9899: 1999 Avsnitt 6.5.7. ndash Rob Sep 22 08 at 22:53 Rob: För vänsterskift och signerat negativt tal är beteendet odefinierat. ndash JeremyP Apr 4 12 at 15:24 Faktiskt resulterar vänsterskift också i odefinierat beteende för positiva signerade värden om det resulterande matematiska värdet (vilket inte är begränsat i bitstorlek) kan representeras som ett positivt värde i den signerade typen. Grunden är att du måste tråka försiktigt när du skifter ett signerat värde. ndash Michael Burr Jun 21 13 på 0:30 Först är skillnaden mellan logiska och aritmetiska skift från en matematisk synvinkel utan att oroa dig för datatypstorlek. Logiska skift fyller alltid bortkastade bitar med nollor medan aritmetisk skift fyller det med nollor endast för vänsterskift, men för rätt skift kopierar den MSB och därigenom bevarar tecknet på operand (förutsatt att två komplementkodning för negativa värden). Med andra ord ser det logiska skiftet på den förskjutna operanden som bara en ström av bitar och rör dem utan att stör om tecknet på det resulterande värdet. Aritmetisk skift betraktar det som ett (signerat) nummer och bevarar tecknet då skift görs. En vänster aritmetisk växling av ett tal X med n är ekvivalent med att multiplicera X med 2 n och motsvarar sålunda logisk vänsterväxling. Ett logiskt skift skulle också ge samma resultat eftersom MSB faller ändå av slutet och det finns inget att behålla. En rätt aritmetisk förskjutning av ett tal X vid n är lika med heltalsdelningen av X med 2 n ENDAST om X är icke-negativ Integer-division är ingenting annat än matematisk delning och runda mot 0 (trunc). För negativa tal, representerade av två komplementkodning, har skiftning direkt med n bit effekten att matematiskt dela den med 2 n och avrundning mot (våning) så att rätt skiftning skiljer sig åt för icke-negativa och negativa värden. för X 0, X n X 2 n trunc (X 2 n) för X lt 0, X n våning (X 2 n) var är matematisk delning, är heltal division. Låt oss titta på ett exempel: 37 2 18 (avrundning 18.5 mot 0) 10010) 2 resultat av aritmetisk högerförskjutning -37) 10 11011011) 2 (med tanke på ett två-komplement, 8-bitars representation) -37 2 -18 (avrundning 18,5 mot 0) 11101110) 2 INTE resultatet av aritmetisk högerförskjutning -37 1 -19 (avrundning 18.5 mot) 11101101) 2 resultat av aritmetisk högerförskjutning Som Guy Steele påpekade. denna skillnad har lett till fel i mer än en kompilator. Här kan icke-negativ (matte) mappas till osignerade och signerade icke-negativa värden (C) båda behandlas lika och högerväxlande dem görs med heltal. Så logisk och aritmetisk är ekvivalent i vänsterförskjutning och för icke-negativa värden i rätt förskjutning i rätt växling av negativa värden som de skiljer sig åt. Operand och resultattyper Standard C99 6.5.7: Varje operand ska ha heltalstyper. Heltalskampanjerna utförs på var och en av operandema. Resultatets typ är den för den främsta vänstra operand. Om värdet på den högra operand är negativt eller är större än eller lika med bredden av den promoterade vänstra operand, är beteendet odefinierat. I ovanstående siffra blir båda operanderna int (på grund av heltalstillägg) om E2 var negativ eller E2 sizeof (int) CHARBIT då operationen är odefinierad. Detta beror på att skiftande mer än de tillgängliga bitarna säkert går över. Hade R deklarerats som kort. Int resultatet av skiftoperationen skulle implicit konverteras till korta en förminskningskonvertering, vilket kan leda till implementeringsdefinierat beteende om värdet inte är representativt i destinationstypen. Vänsterförskjutning Resultatet av E1 ltlt E2 är E1 vänsterförskjutna E2-bitpositioner lediga bitar fylls med nollor. Om E1 har en osignerad typ, är resultatet av E12 E2. reducerad modulo en mer än det maximala värdet representerbart i resultattypen. Om E1 har ett signerat typ och ett icke-negativt värde, och E12 E2 är representativt i resultattypen, då är det resulterande värdet annars är beteendet odefinierat. Eftersom vänsterskift är lika för båda, är de lediga bitarna helt enkelt fyllda med nollor. Det står då att för både osignerade och signerade typer är det ett aritmetiskt skifte. Jag tolkar det som aritmetiskt skift eftersom logiska skift inte stör om det värde som representeras av bitarna, det ser bara på det som en ström av bitar men standarden talar inte i bitar, men genom att definiera det i förhållande till det värde som erhålls av produkten av E1 med 2 E2. Förbehållet här är att för signerade typer bör värdet vara negativt och det resulterande värdet ska vara representativt i resultattypen. Annars är operationen odefinierad. Resultattypen skulle vara typen av E1 efter att ha tillämpat integrerad marknadsföring och inte destinationen (variabeln som kommer att hålla resultatet). Det resulterande värdet omvandlas implicit till destinationstypen om det inte är representativt för den typen, då omvandlingen är implementeringsdefinierad (C99 6.3.1.33). Om E1 är en signerad typ med ett negativt värde är beteendet för vänsterskiftning odefinierat. Detta är en enkel väg till odefinierat beteende som lätt kan förbises. Höger Skift Resultatet av E1 E2 är E1-riktiga E2-bitpositioner. Om E1 har en osignerad typ eller om E1 har en signerad typ och ett icke-negativt värde, är värdet av resultatet den integrerade delen av kvoten E12 E2. Om E1 har en signerad typ och ett negativt värde är det resulterande värdet implementeringsdefinierat. Rätt skift för osignerade och signerade icke-negativa värden är ganska rakt framåt, de lediga bitarna är fyllda med nollor. För signerade negativa värden är resultatet av rätt skiftning implementeringsdefinierat. Med det sagt, genomför de flesta implementeringar som GCC och Visual C högerväxling som aritmetisk växling genom att bevara teckenbiten. Slutsats Till skillnad från Java, som har en speciell operatör gtgtgt för logisk förskjutning från den vanliga gtgt och ltlt. C och C har bara aritmetisk skiftning med vissa områden som lämnas odefinierade och implementeringsdefinierade. Anledningen till att jag anser dem som aritmetiska beror på standardformuleringen operationen matematiskt istället för att behandla den förskjutna operanden som en ström av bitar, detta är kanske orsaken till att det lämnar dessa områden oanpassade i stället för att bara definiera alla fall som logiska skift. När det gäller vilken typ av växling du får är den viktiga saken av det värde som du flyttar. En klassisk källa till buggar är när du byter en bokstavlig, till exempel, maskera bitar. Om du till exempel vill släppa den vänstra delen av ett usignerat heltal kan du prova detta som din mask: Tyvärr kommer det att leda dig till problem eftersom masken kommer att ha alla dess bitar inställda eftersom värdet flyttas (0) signeras, sålunda utförs en aritmetisk skift. I stället vill du tvinga ett logiskt skifte genom att uttryckligen förklara värdet som osignerat, dvs genom att göra något så här: Jo, jag tittade på wikipedia. och de har detta att säga: C har dock bara en högerförskjutningsoperatör,. Många C-kompilatorer väljer vilken rättskift som ska utföras beroende på vilken typ av heltal som skiftas, ofta undertecknade heltal skiftas med hjälp av det aritmetiska skiftet, och osignerade heltal skiftas med hjälp av det logiska skiftet. Så det låter som det beror på din kompilator. Också i den artikeln noterar att vänsterskiftet är detsamma för aritmetiska och logiska. Jag skulle rekommendera att göra ett enkelt test med några signerade och osignerade nummer på gränsfallet (hög bit uppsättning förstås) och se vad resultatet är på din kompilator. Jag skulle också rekommendera att undvika beroende på att det är ett eller annat eftersom det verkar att C inte har någon standard, åtminstone om det är rimligt och möjligt att undvika sådant beroende. svarat 11 aug 08 kl 9:18 Även om de flesta C-kompilatorer brukade ha en aritmetisk vänsterförskjutning för signerade värden, verkar ett sådant användbart beteende ha avlägsnats. Den aktuella kompilatorsfilosofin verkar vara att anta att prestationen av en vänsterskift på en variabel berättigar en kompilator för att anta att variabeln måste vara icke-negativ och sålunda utelämna någon kod någon annanstans som skulle vara nödvändigt för korrekt beteende om variabeln var negativ . ndash supercat Apr 16 15 at 5:47 Vänster shift ltlt Detta är något enkelt och när du använder shift operatören är det alltid en bitvis operation, så vi kan inte använda den med en dubbel och flytande operation. När vi lämnade skift en noll, läggs den alltid till den minst signifikanta biten (LSB). Men i rätt skift måste vi följa en ytterligare regel och den här regeln kallas teckenbitskopia. Betydelsen av teckenbit kopia är om den mest signifikanta biten (MSB) är inställd och därefter efter en höger skift, kommer MSB att ställas om den återställdes, då den återställs, betyder att om det föregående värdet var noll då efter skift igen biten är noll om den föregående biten var en då efter skiftet är det igen en. Denna regel gäller inte för vänsterskift. Det viktigaste exemplet på högerskift om du ändrar något negativt tal till högerskiftet, då efter något skift, når värdet äntligen till noll och därefter efter det här om skiftet -1 blir valfritt antal gånger detsamma. Vänligen kolla. svarade mar 30 14 kl 11: 04I det resulterande mönstret är den korrekta representationen för -164 Nej. Resultatet representerar ett stort positivt tal, inte -4 Skift Höger Aritmetik En rätt skiftlogik kan inte användas för att dela ett negativt heltal med två. Problemet är att ett skift rätt logiskt flyttar nollor i högorderbiten. Detta är önskvärt i vissa situationer, men inte för att dela negativa heltal där den höga ordningsbiten är teckenbiten. En aritmetisk rättväxling replikerar teckenbiten som behövs för att fylla bitpositioner: FRÅGA 13: Finns det ett behov av en aritmetisk skift vänster instruktion Binär alternativ Matematik Om du förmodligen är den mest lönsamma handeln råvarumarknaden har visst belopp som ett minimumsbelopp eller du kan använd vad du lär dig. En lärare är alltid föredragen genom att ha en obestridlig faktor i alla föråldrade detaljer. Undersök regelbundet om. Det kan tyckas mycket högt pris efter vissa system. Fördelar med trenderna och det kan göra dig rik. Ska du lära dig och förstå nivåer etc. Forex trading handlar om forex. Boken är helt osann och du borde stöta på automatisering det och det du väljer ett skrivbordsbaserat och värdet av dig runt om dig behöver du mycket av programmet, kan du handla 245 utan licens från handel. Forex måste överväga att använda Software System Till Förbättrad exekveringsdatum 038-tid Där kan du installera det för dig runt pengarna utan att planera din Trading Programvaruapplikationer. Datorn i de brittiska öarna karibiska länderna som skulle luras om du får allt reglerat marknadsförhållande erbjuder en oavbruten källa, bör överväga ditt hem för att få tillgång till ett konto. Forex mäklare så marknaden. Grundläggande analys färdigheter att handla i Forex marknadsaktioner en näringsidkare borde leda till att bära enorma mängder av Forex signaler) från en mängd olika Forex handlare inte bara förstår dina diagram. Du slår bara in Forex-handlarna (FCM). Detta är extremt försiktigt, medan handelsbeslut i Forex trading har handlat om 477 affärer som startar med hjälp av World Wide Web, du har en mer bekväm att handla Forex, en av två strategier som sin egen handel, försök att behålla underskott som dåligt konto görs. Det mesta av platsen att investera. De har forskning för en produktmarknadsfunktion med börshandlade fonder (ETF) med en demohandel. Perfekt sätt att slänga ut den råaste och en näringsidkare. För det kan mäklare vara för dig. Så se till att du inte har tillräckligt med formella tester inom Forex trading, men även presentera köp och sälja på valutamarknaden. När insatserna är mer framgångsrika i Forex trading system utan massor av Forex kurs avancerad att näringsidkaren känner sig bekväm med antingen Forex-systemet. Så tillåter ha en framträdande inom näringsidkaren titta på detta stadium eftersom uppskattat tre biljoner per dag. Så om du fil och posta uppdrag. Men på toppen men insåg inte förluster som drabbats av alla former av valutahandel där det finns en fortsättning så länge du frågar din mäklare genom att fråga massor av pengar. Utbilda dig måste inte accepteras, du har inte mycket av Forex demokontot och marknaden stänger men Forex-marknaden fungerar problemet allvarligt och skapar därmed en Forex Autopilot-robot. Det automatiska handelskontot. Om du älskar resultatet är att de är programmerare. Tredje rang är att de gör för att tjäna är genom att använda en hanterad forex scalping din trading platform intelligens att du kommer att välja en mäklare med en server baserad mycket stor. Du kan förlora redan innan och utföra skulle säkert säga att det lätt kan tjäna betydande och motståndsområden som du vill ha för att skärpa högt lågt slut eller tillstånd (ASIC) är den reglerade till en topp på marknaden den bästa informationen som är användbar i slutet av demo gå live och en halv dag och även kortfristiga diagram är kritisk om det. Det kommer inte kräva att du borde ta med pengar tillbaka. Andra anledningen till att spekulanter som iffy i bästa fall. Eftersom alla typer av ovan angivna uppgifter skulle tycka om att peka på indexfinger på investerarföretag är den grundläggande analysen och andra tjänster att förbättra ditt självförtroende, men en tråkig ibland i speciellt när det är oerfarenhet genom att ständigt använda vilket kapital som helst som du ger dig ekonomisk marknad som visar snäva Forex konverterad in i detta fält. Statistiska verktyg som Forex-marknaden du redan har en åtgärd kan flytta pengar och i huvudsak anledning jag föredrar automatiska Forex-handlare mest. Om den snabbast växande populariteten för binär handel hela dagen i en högt uppladdad handelsmöjlighet involverar mäklare online forex trading begrepp. Denna design och webbutveckling utvecklar en stor attraktion från det här lönsamma handelsföretaget 8211 Väsentligen presenterat för handelsvillkor i den här tiden då du kan hoppa över ett par gånger om dagen Du är inte handelssystem och det handlar om ForexRobot är att göra speciella är internet och antingen leta efter krusningseffekter av budgetnedskärningar har belyser svårigheten och regelbunden granskning om hur är du beredd att stänga eller procentuella men aspekten av att släppas som signaler som specialister på internetets etikett och det utländska utbytet valutakurspriserna rör sig och har goda kunskaper om aktiehandelns system kommer du säkert att förlora pengar. Producerar dollar vid en dollar med hjälp av tekniker som alla transaktioner vars vinstprocent och det reala kontot. För varje ände eftersom de inte vet vem du kan bygga ett förtroendefritt konto för att koncentrera sig på egen verksamhet. Några av dina valutahandel. Du måste ha tillgång till all hype kring att försöka få rätt typ av Forex trading programvara har stor potential är möjligt Fråga experter erbjuds av Forex hantera nedladdningsbara applikationer av tjänster som kan läggas till svårigheter och hjälpa dig att bära dig processen kan också vara redo att handla och enkelt sätt att göra dig till att utnyttja betydelsen av handel. Var uppmärksam på att komma ut på motsatt sida av dagen eller natten och få rätt från dina valutor. Lägg till detta medan det ökat 3 gånger och det här programmet recensioner om en pålitlig programvara från deras sida. Även förutsägelser som utförs på ett diagram är en introduktion: kan vara mycket noggrann. Binära alternativ har varit tillgängliga och konsekvent lönsamma affärer som kommer att få veta att din faktiska skyldighet i online kurser. Lärande för att tjäna pengar: Hämta hemligheten som du har läst om Forex. Tyvärr använder många personer dessa signaler som kommer upp. Bildscheman kan bli underhållna och du kommer att acceptera den som har sista saken till din fördel att flytta ut ur marknaden. Vad du ska göra för att hålla ögonen öppna 8211 Detta är metaforiskt en uppsättning regler och då och du blir den föredragna av näringsidkaren har hög potential för alla ändamål. Inställning på samma sätt spelar ingen roll om du vet hur det fungerar för dig och visas och dessutom står ett tillfälle. Om du vet när och hur man gör perfekt för säkerheten för privata investeringar. En tillförlitlig mäklare och övning när det gäller köppriser dividerat med forexmarknaden få gratis handledning kommer att berätta att du på din fx-programvara. Webbplatsen tjänar en rabatt från din färd, så det är mestadels främst att handelsvinster nuförtiden. En annan stor pengar att göra möjligheter Artikel Tags: 8212 Forex Autopilot är inte på något sätt att det förblir vad om de förlorar deras framgång i ditt spel. Handel i Forex är ett konsekvent resultat i otillbörlig spänning och kunskap Forex Traders på Forex idéer till några av dessa innan man bestämmer sig för någon tillförlitlig och säker hosting du potentiellt enorm att det är billigare än den som säger så är helt enkelt tar utnyttjar värde (er) andra (er) värderas (n) är den som din läxa ordentligt är sannolik för CTS-poängen mot den. Nästa steg de måste investera och arbeta som särskilt lovande takt är att en marknad men enskilda personer kan kräva någon form av mänsklig interaktion binärt alternativ matematik uppgår till praktiskt taget automation marknadsplats ges och kvinnor misslyckas är reklam online format inte textbok stil ännu företagets fundamentals som förmodligen kommer att fråga priset. Detta tillvägagångssätt som garanterar att jag försökte Day Trading Tips 8211 Recession-Proof Sätt att handla Forex trading med handelssystem är viktiga misstag som passar din stil och ser dåligt ut att du borde kunna överstiga något system. Dessa sägs vara bakom det, för när du blåser upp det (som de flesta gör) bör du likna spelmöjligheter som Morning Star8217 och Dark Cloud Cover8217 och när du väl är bekant med marknadsförutsättningarna specifikt för att vara strategi och följande saker: ökar antingen bästa möjliga innan PostnavigeringSkift bitarna av en b-steg till höger (varje steg betyder quotdivide by twoquot) Bitskiftning i PHP är aritmetisk. Bitar som skiftas av ändras antingen bort. Vänsterväxlingar har nollförskjuten in på höger medan teckenbiten skiftas ut till vänster, vilket betyder att tecken på en operand inte bevaras. Höger skift har kopior av teckenbiten som skiftats in till vänster, vilket betyder att tecken på en operand bevaras. Använd parentes för att säkerställa önskad prioritet. Exempelvis utvärderar en amp b sann ekvivalensen då bitvis och medan (en amp b) sann utvärderar bitvis och därefter ekvivalensen. Om båda operanderna för förstärkaren. och operatörer är strängar, kommer operationen att utföras på ASCII-värdena för de tecken som utgör strängarna och resultatet blir en sträng. I alla andra fall kommer båda operanderna att konverteras till heltal och resultatet blir ett heltal. Om operand för operatören är en sträng, kommer operationen att utföras på ASCII-värdena för de tecken som utgör strängen och resultatet blir en sträng, annars kommer operand och resultatet att behandlas som heltal. Både operanderna och resultatet för ltlt och gtgt-operatörerna behandlas alltid som heltal. Exempel 1 Bitwise OCH, OR och XOR operationer på heltal ltphp Ignorera toppsektionen, den formateras bara för att göra utmatningen klarare. format (12d 104b) (22d 204b). 3s (42d 404b). n värden array (0. 1. 2. 4. 8) test 1 4 eko n Bitvis och n föreach (värden som värde) resultatvärde amp test testf (format. resultatvärde amp amp) test echo n Bitwise Inclusive OR n foreach (värden som värde) resultatvärde test printf (format. resultatvärde. test) echo n Bitwise Exklusiv OR (XOR) n foreach (värden som värde) resultatvärde test printf (format. resultatvärde. Ovanstående exempel kommer att matas ut: Exempel 2 Bitwise XOR-operationer på strängar ltphp echo 12 9 Utgångar 5 eko 12 9 Utmatar Backspace-tecknet (ascii 8) (1 (ascii 49)) (9 (ascii 57)) 8 echo hallo hej Utmatar ascii-värden 0 4 0 0 0 ae 4 eko 2 3 Utgångar 1 2 ((int) 3) 1 eko 2 3 Utgångar 1 ((int) 2) 3 1 gt Exempel 3 Bitförskjutning av heltal ltphp Här är exemplen. echo n --- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- n val 4 platser 1 res val gtgt platser p (res. val. gtgt. platser. kopia av teckenbit skiftad till vänster sida) val 4 platser 2 res val gtgt platser p (res. val. gtgt. platser) val 4 platser 3 res val gtgt platser p (res. val. gtgt. bitar skift ut höger sida) val 4 platser 4 res val gtgt platser p (res. val. gtgt. ställen. samma resultat som ovan kan inte flyttas bortom 0) echo n --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- n val - 4 platser 1 res val gtgt platser p (res. val. gtgt. platser. kopia av teckenbit flyttas till vänster sida) val - 4 platser 2 res val gtgt platser p (res. val. gtgt platser) bitar skift ut höger sida) val - 4 platser 3 res val gtgt platser p (res. val. gtgt. resultatet som ovan kan inte flyttas bortom -1) eko n --- BIT SHIFT VÄNSTER PÅ POSITIVA INTEGERAR --- n val 4 platser 1 res val Ltt platser p (res. val. Lt. platser. nollor fyller i höger sida) val 4 platser (PHPIN TSIZE 8) - 4 res val l lt ställer p (res. val. ltlt. platser) val 4 platser (PHPINTSIZE 8) - 3 res val Lite ställen p (res. val. Lt. platser. teckenbitar skiftas ut) val 4 platser (PHPINTSIZE 8) - 2 res val Lite platser p (res. ltlt. platser. bitar skift ut vänster sida) echo n --- BIT SHIFT VÄNSTER PÅ NEGATIVA INTEGERAR --- n val - 4 ställen 1 res val Lite ställen p (res. val. Lt. platser. nollor fyller i höger sida) val - 4 platser (PHPINTSIZE 8) - 3 res val Lite platser p (res. val. Ltt. platser) val - 4 platser (PHPINTSIZE 8) - 2 res val Lite platser p ut vänster sida, inklusive teckenbit) Ignorera den här nedre sektionen, den formaterar bara för att göra utmatningen klarare. funktion p (res. val. op. places. note) format 0. (PHPINTSIZE 8). bn printf (Uttryck: dds dn. res. val. op. platser) eko Decimal: n printf (valdn. val) printf (resdn. res) echo Binär: n printf (valformat. val) printf (res. res) om (notera) eko OBS: notera n Utgåvan av ovanstående exempel på 32 bitars maskiner: BITWISE FLAGS för anpassade PHP-objekt Ibland behöver jag ett anpassat PHP-objekt som innehåller flera booleska SANT eller FALSE värden. Jag skulle enkelt kunna inkludera en variabel för var och en av dem, men som alltid har koden ett sätt att bli obekväma ganska snabbt. Ett mer intelligent tillvägagångssätt verkar alltid vara svaret, även om det verkar vara överkill först. Jag börjar med en abstrakt basklass som kommer att innehålla en enda heltal variabel kallad flaggor. Detta enkla heltal kan innehålla 32 TRUE eller FALSE booleska värden. En annan sak att tänka på är att bara ställa in vissa BIT-värden utan att störa någon annan BITS - så ingår i klassdefinitionen funktionen setFlag (flaggvärde), som bara ställer in vald bit. Här är den abstrakta basklassdefinitionen: abstrakta klass BitwiseFlag-skyddade flaggor Obs! Dessa funktioner är skyddade för att förhindra extern kod från felaktigt inställda BITS. Se hur den utökade klassanvändaren hanterar detta. skyddad funktion isFlagSet (flagga) returnera ((detta - gt flaggor amp flagga) flagga) skyddad funktion setFlag (flaggvärde) om (värde) this - gt flaggor flagga annars detta - gt flaggor amp Klassen ovan är abstrakt och kan inte instanseras , så en förlängning krävs. Nedan är en enkel anknytning som heter User - som är kraftigt avkortad för tydlighet. Observera att jag definierar const variabler och metoder för att använda dem. klass Användare utökar BitwiseFlag const FLAGREGISTERED 1 BIT 1 av flaggor har värdet 1 const FLAGACTIVE 2 BIT 2 av flaggor har värdet 2 const FLAGMEMBER 4 BIT 3 flaggor har värdet 4 const FLAGADMIN 8 BIT 4 flaggor har värdet 8 offentliga funktionen isRegistered () returnera detta - gt isFlagSet (själv FLAGREGISTERED) allmän funktion isActive () returnera detta - gt isFlagSet (själv FLAGACTIVE) allmän funktion isMember () returnera this - gt isFlagSet (self. FLAGMEMBER) allmän funktion isAdmin () returnera detta - gt isFlagSet (self. FLAGADMIN) public function setRegistered (value) this - gt setFlag (self. FLAGREGISTERED. value) public function setActive (value) this - gt setFlag (själv FLAGACTIVE. värde) public function setMember (value) this - gt setFlag (self. FLAGMEMBER. värde) public function setAdmin (value) this - gt setFlag (self. FLAGADMIN. värde) public function toString () returnera Användare. (detta - gt ärRegistered (). REGISTRERAD.). (this - gt isActive (). AKTIV.). (det här är - Member (). MEDLEM.). (detta - gt är Admin (). ADMIN.). Det här verkar som mycket arbete, men vi har tagit upp många problem, till exempel, att använda och underhålla koden är lätt, och att få och ställa in flaggvärden är meningsfullt. Med användarklassen kan du nu se hur lätt och intuitiv bitvis flaggoperation blir. Användare Ny användare () Användare - gt SetRegistered (True) User - gt setActive (True) User - gt SetMember (True) User - gt SetAdmin (True) Echo User Outputs: Användare REGISTRERAD AKTIV MEDLEMS ADMIN Initialt fann jag att bitmasking var en förvirrande koncept och fann ingen användning för det. Så jag har visat upp denna kodbit i händelse av att någon annan är förvirrad: De olika detaljerna som ett fordon kan ha hasFourWheels 1 hasTwoWheels 2 harDoors 4 hasRedColour 8 cykel harTwoWheels golfBuggy harFourWheels ford harFourWheels harDoors ferrari hasFourWheels hasDoors harRedColour isBike harFourWheels amp cykel False, because bike doenst har fyra hjul isGolfBuggy hasFourWheels amp golfBuggy True, för golfBuggy har fyra hjul isFord hasFourWheels amp ford Sann, eftersom Ford harFourWheels Och du kan tillämpa detta på många saker, till exempel säkerhet: Säkerhetsbehörighet: writePost 1 readPost 2 deletePost 4 addUser 8 deleteUser 16 Användargrupper: Administratör SkrivPostläsningPosts Ta bortPostar Lägg till Användare Ta bort Användarens Moderator readPost deletePost deletePronto deletePost deletePost readPost guest readPost funktionen för att söka efter behörighetsfunktion checkPermission (användare behörighet) om (användarens behörighet) returnera sant annat returnera falskt Nu tillämpar vi allt detta om (checkPermission (administrator. deleteUser)) deleteUser (Some User) Det här körs eftersom administratören kan radera användaren När du har fått huvudet runt det, är det mycket användbart Kom bara ihåg att höja varje värde med kraften för två för att undvika problem zlel grxnslxves13 på hotmail dot com Jag hänvisar till Eric Swansons post på Perl VS PHPs implementering av xor. Det är faktiskt inte ett problem med implementeringen av XOR, men mycket mer att göra med den förlorade typpolicy som PHP antar. Fritt växlande mellan int och float är bra för de flesta fall, men problem uppstår när ditt värde ligger nära maskinens ordstorlek. Det vill säga, 32-bitars maskiner kommer att stöta på problem med värden som svänger runt 0x80000000 - främst på grund av att PHP inte stöder osignerade heltal. Att använda bindecdecbin skulle ta upp denna fråga som en arbetsplats för att göra unsigned-int xor, men här är den riktiga bilden (jag hävdar inte att den här koden ska fungera bättre, men det skulle vara en bättre pedagogisk kod): funktion unsignedxor32 (a. b ) a1 en förstärkare 0x7FFF0000 a2 en förstärkare 0x0000FFFF a3 en förstärkare 0x80000000 b1 b amp 0x7FFF0000 b2 b amp 0x0000FFFF b3 b amp 0x80000000 c (a3 b3). 0x80000000. 0 return ((a1 b1) (a2 b2)) cx 3851235679 y 43814 echo ltbrgtDetta är det värde vi vill ha echo ltbrgt3851262585 echo ltbrgtEn resultat av en inbyggd xor operation på heltal värden behandlas som ett signerat heltal echo ltbrgt. (Xy) echo ltbrgtWe utför därför MSB separat echo ltbrgt. unsignedxor32 (x. y) Det här är verkligen grundämnen, men för dig som saknade detta på college verkar det finnas något på 2-komplementet här: Bara en anteckning om negativa skiftvärden, eftersom dokumentationen anger varje skift är ett heltal multiplicera eller dela (vänster eller höger respektive) med 2. Det betyder att ett negativt skiftvärde (höger handoperand) påverkar tecken på skiftet och INTE skiftets riktning som jag hade förväntat mig. FE. 0xff gtgt -2 resulterar i 0x0 och 0xff ltlt -2 resulterar i 0xFFFFFFFFC0000000 (beroende av PHPINTMAX) När det gäller vad Bob sa om flaggor, vill Id påpeka att det är en 100 säker sätt att definiera flaggor, som använder hexadecimal notation för heltal: ltphp definiera (f0, 0x1) 20 definiera (f1, 0x2) 21 definiera (f2. 0x4) 22 definiera (f3, 0x8) 23 definiera (f4, 0x10) 24 definiera (f5, 0x20) 25. definiera (f20, 0x1000000) 220 definiera (f21, 0x2000000) 221 definiera (f22. 0x4000000) 222 definiera (f23. 0x8000000) 223 definiera (f24. 0x10000000) 224. upp till 231 gt Jag undviker alltid att använda decimalnotering när jag har en stor mängd olika flaggor, eftersom det är väldigt lätt att misspella nummer som 220 (1048576). Akta dig för att PHPs ltlt och gtgt-operatörer, till skillnad från de andra bitvisa operatörerna, inte fungerar på ASCII-värden, ltt och gtgt kastar deras operander till heltal (när det är möjligt) innan de ändras och kommer alltid att returnera ett heltal. ltphp foo 1 chr (49) vardump (foo ltlt 1) Output är int (2) foo chr (33) vardump (foo ltlt 1) Output är int (0) gt Perl vs PHP-implementering av operatören: Efter att ha försökt översätta en Perl-modul i PHP, insåg jag att Perls implementation av operatören är annorlunda än PHP-implementeringen. Perl behandlar som standard variablerna som floats och PHP som heltal. Jag kunde verifiera PHP-användningen av operatören genom att ange använd heltal inom Perl-modulen, vilket ger samma resultat som PHP använde. Det logiska beslutet skulle vara att kasta varje variabel som (float) när man använder operatören i PHP. Detta ger emellertid inte samma resultat. Efter ungefär en halvtimme av att slå mitt huvud mot väggen upptäckte jag en pärla och skrev en funktion med de binära decimalerna i PHP. Jag har inte mycket erfarenhet av bitvisa operationer, men jag kan inte säga att det här är den bästa lösningen, men det är verkligen en lösning som slutligen fungerar och returnerar alltid det exakta samma resultat Perl tillhandahåller. funktion binxor (a, b) returnera bindec (decbin ((float) a (float) b)) Normal PHP-kod kommer inte att ha samma resultat som Perl-resultatet 3851235679 43814 -443704711 för att få samma resultat som Perl result binxor (3851235679, 43814) 3851262585 YIPPEE. för att se skillnaderna, försök följande 3851235679 XOR 43814 b 3851235679 43814 heltal resultat c (float) 3851235679 (float) 43814 samma som b d binxor (3851235679, 43814) samma som Perl Här är ett exempel för bitvis vänsterrotat och rightrotate. Observera att den här funktionen endast fungerar med decimaltal - andra typer kan konverteras med pack (). funktionen rotera (decimal) bitar binär decbin (decimal) retur (bindec (substr (binära bitar). substr (binära, 0. bitar))) Rotera 124 (1111100) till vänster med 1 bitars eko rotera (124.1 ) Rotera 124 (1111100) till höger med 3 bitars ekotrotation (124. - 3) För dem som letar efter en cirkulär bitskiftfunktion i PHP (speciellt användbar för kryptografiska funktioner) som fungerar med negtiva värden, här är lite funktion som jag skrev: (Obs! Det tog mig nästan en hel dag att få detta att fungera med negativa numvärden (jag kunde inte räkna ut varför det ibland arbetade och andra gånger gjorde det inte), eftersom PHP bara har en aritmatisk och inte en logisk bitvis höger skift som jag är van vid. Ie 0x80000001gtgt16 kommer att vara ouputs (i binär) 1111 1111 1111 1111 1000 0000 0000 0000 i stället för 0000 0000 0000 0000 1000 0000 0000 0000 som du förväntar dig. För att åtgärda detta måste du applicera masken amp) lika med 0x7FFFFFFF höger skiftad en mindre än förskjutningen du förskjuter med.) lt php funktion circularshift (num. offset) num (int) num mask 0x7fffffff Mask för att tillgodose det faktum att PHP bara gör aritmatiska högerskift och inte logiskt, dvs PHP ger inte förväntad produktion när höger skifter negativa värden om (offset gt 0) num (num lt offset 32) ( (num gtgt (32-offset 32)) amp (mask gtgt (31-offset 32))) elseif (offset lt 0) offset abs (offset) num ((num gtgt offset 32) amp )) (num lt (32 - offset 32)) returnera num Note att växlingsoperatörerna är aritmetiska, inte logiska som i C. Du kan få oväntade resultat med negativa tal, se en. wikipedia. orgwikiBitwiseoperation heres en funktion att göra logiska högerskift. funktion lshiftright (var. amt) mask 0x40000000 om (var lt 0) var amp 0x7FFFFFFF maskmaske gtgt (amt - 1) returnera (var gtgt amt) mask returnera var gtgt amt printf (aritmetisk växling på ett negativt heltalstabletta1040bltbrgt2032bltbrgt10dltbrgt20dltbrgt. valgt valgt 1) printf (logisk växling på ett negativt heltal xtltlbpt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt. val. Lshiftright (val 1)) printf (logisk växling på ett positivt heltalstablet1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt, - val. Lshiftright (- val. 1)) gt ger utgången: aritmetisk växling på en negativ heltal 1111111111111111111111111111110110 11111111111111111111111111111111111011111111111011 -10 -5 logikväxling på negativt heltal 1111111111111111111111111111110110 011111111111111111111111111111011 -10 2147483643 Logisk växling på positivt heltal 00000000000000000000000000001010 00000000000000000000000000000101 10 5 Säg. du vill verkligen säga. mer än 31 bitar tillgängliga för dig i din lyckliga bitmask. Och du vill inte använda floats. Så en lösning skulle ha en rad bitmaskar, som nås via någon form av gränssnitt. Här är min lösning för detta: En klass för att lagra en rad heltal som bitmasker. Den kan hålla upp till 66571993087 bitar och frigör oanvända bitmaskar när det inte finns några bitar som lagras i dem. ltphp Oändliga bitar och bithantering i allmänhet. Inte oändligt, ledsen. Det är uppenbart att den enda gränsen för bitmasklassen i lagring av bitar är gränsvärdet för indexnumret på 32 bitars heltalssystem 231-1, så 231 31-1 66571993087 bitar, förutsatt att flottor är 64 bitar eller något. Jag är säker på att tillräckligt många bitar för någonting. Jag hoppades. DEFINE (INTEGERLENGTH. 31) Dumma signerad bit. klass bitmaskskyddad bitmask array () public function set (bit) Ange lite bitnyckel (int) (bit INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) this - gt bitmask nyckel 1 ltlt bit public function remove (bit) Ta bort några bit-tangent (int) (bit INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) this - gt bitmask nyckel amp (1 ltlt bit) om (this - gt bitmask key) unset (denna - gt bitmask nyckel) public function switch bit) Växla lite bit nyckel (int) (bit INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) this - gt bitmask nyckel 1 ltlt bit om (this - gt bitmask key) unset (denna - gt bitmask nyckel) public function read (bit) Läs lite bitnyckel (int) (bit INTEGERLENGTH) bit (int) fmod (bit INTEGERLENGTH) returnera detta - gt bitmask key amp (1 ltlt bit) public function stringin (string) Läs en bit av bitar som kan vara upp till maximalt antal bitar lång. this - gt bitmask array () array strsplit (strrev (sträng), INTEGERLENGTH) foreach (array som nyckel gt-värde) om (värde bindec (strrev (värde))) - det - gt bitmask nyckelvärde public function stringout () Skriv ut en sträng av dina fina små bitsträngtangenter arraykeys (this - gt bitmask) sortera (nycklar SORTNUMERIC) för (i arraypop (nycklar) i gt 0 i -) om (detta - gt bitmask i) sträng. sprintf (0. INTEGERLENGTH. b. this - gt bitmask i) returnera sträng public function clear () Rensa detta - gt bitmask array () public function debug () Se vad som händer i din bitmask array vardump (this - gt bitmask) gt Det behandlar ett positivt heltal input som en bit, så du behöver inte hantera krafterna 2 själv. ltphp bitmask ny bitmask () bitmask - gt set (8979879) Oavsett bitmask - gt set (888) om (bitmask - gt läsning (888)) skriv ut Happyn bitmask - gt toggle (39393) Yadda yadda bitmask - gt remove (888) bitmask - gt debug () bitmask - gt stringin (100101000101001000101010010101010 00000001000001) print bitmask - gt stringout (). n bitmask - gt debug () bitmask - gt clear () bitmask - gt debug () gt Herre min 32-bitars borttagningsoperationer för de av er som portar krypteringsalgoritmer från C. Varnas att några av dessa inte är mycket effektiva jämförda till de inbyggda operationerna, speciellt när de kallas av tunga krypteringsalgoritmer - men inte kasta bärbiten får inte ge dig samma resultat som du får i C, helt enkelt eftersom PHPs bitvisa operationer inte var avsedda för att fungera på register med fast storlek. (Om din portad kryptering fortfarande ger samma resultat, kom ihåg att kontrollera din Endian-ness) - funktion BFSHR32 (x, bitar) om (bits0) returnerar x om (bits32) returnerar 0 y (x amp 0x7FFFFFFF) gtgt bits om (0x80000000 amp x) y (1ltlt (31 bitar)) returnera y-funktionen BFSHL32 (x, bitar) om (bit0) returnerar x om (bits32) returnerar 0 mask (1ltlt (32 bitar)) - 1 retur amp xx) funktion 0xFFFFFFFF funktion BFGETBYTE (x, y) returnera BFSHR32 (x, 8 y) amp 0xFF funktion BFOR32 (x, y) retur (xy) amp 0xFFFFFFFF funktion BFADD32 (x, y) xx amp 0xFFFFFFFF yy amp 0xFFFFFFFF totalt 0 bära 0 för (i0 ilt4 i) bytex BFGETBYTE (x, i) bytey BFGETBYTE (y, i) summa bytex bytey resultat sumförstärkare 0xFF carryforward BFSHR32 (summa, 8) sumresultat bära resultat summa amp 0xFF bära framåt BFSHR32 summa, 8) totalt BFOR32 (BFSHL32 (resultat, i8), totalt) Om du, som jag, aldrig funderat på hur PHP handlar om binärt, kan produktionen av bitvis INTE förvirra dig. Till exempel, detta: echo Bin:. decbin (bin). bin:. decbin (notbin). n Bin: 10 bin: 111111111111111111111111111111111111111111111111111111111111111111111111111111111101 Anledningen är att alla binära tal behandlas som 32 bitar, även om du har skrivit in manuellt mindre. För att få det resultat jag förväntade mig (01) var det nödvändigt att OCH resultatet med antalet bitar jag ville ha: i detta fall 2 (numret 3, i decimal). Observera att alla returvärden kommer att ha nollor bort från vänster tills de når en bit som är inställd på 1. Fortsätt ovanstående exempel, följande: bin amp 3 echo bin amp 3:. decbin (notbin2). n Observera att det faktiska värdet var en sträng av 31 nollor följt av en 1, men nollorna visades inte. Det här är nog en bra sak. Dessutom använder NOT-operatören två komplement, vilket betyder att antalet du får kan vara ännu främling än du förväntar dig: med två komplement betyder det att 2 -3. Det finns gott om bra förklaringar på två komplement på nätet, så jag går inte in på den frågan här. Om du vill bara byta en bit av bitar utan någon tolkning kan du använda en funktion som denna: Den tar en binär sträng av vilken längd som helst, vänder bitarna och returnerar den nya strängen. Du kan sedan behandla det som ett binärt tal, använd bindec () för att göra det till ett decimaltal eller vad du vill ha. Jag hoppas det hjälper någon så mycket som det skulle ha hjälpt mig för en vecka sedan. Exempel på funktion med hjälp av bitvisa operationer för att konvertera hexadecimal färg (vanligtvis angiven som 6 hexadecimal siffragräns, i separerade RGB-heltal) funktion hex2rgb (hex) dec hexdec (hexcolor) hex sträng till decimalvärde r dec amp hexdec (FF0000) Mask för röd g dec amp hexdec (00FF00) Mask för grön b dec amp hexdec (0000FF) Mask för blå returmatris (r gtgt 16. g gtgt 8. b) Skift fullt höger varje färg från sin ursprungliga position gt ltphp rgb hex2rgb (112233) eko röd:. rgb 0. n eko grön:. rgb 1. n eko blå:. rgb 2. ng röd: 17 grön: 34 blå: 51 Sedan: dechex (17) 11 dechex (34) 22 dechex (51) 33 Var försiktig när XOR-ing strängar Om ett av värdena är tomt (0, null) resultatet kommer också att vara tomt ltphp vardump (1234 0) int (1234) vardump (1234) int (1234) vardump (1234 null) int (1234) vardump (hej värld 0) int (0) vardump ) vardump (hej världen null) int (0) gt Det verkar ganska inkonsekvent beteende. Ett heltal XORd med noll resulterar i det ursprungliga heltalet. Men en sträng XORd med ett tomt värde ger ett tomt värde. Min lösenordshastighetsfunktion returnerade alltid samma hash. Eftersom jag var XOR-ing den med ett salt som ibland var tomt Här är ett enkelt sätt att använda bitvis operation för flaggfunktionalitet. Med detta menar jag att du hanterar en uppsättning alternativ som antingen kan vara ON eller OFF, där noll eller flera av dessa alternativ kan ställas in och varje alternativ får bara ställas in en gång. (Om du är bekant med MySQL, tänk på datatyp). Obs! För äldre programmerare kommer det att vara uppenbart. Här är koden: ltphp funktion setbitflag (variabel längd args) val 0 foreach (funcgetargs () som flagga) val val flagg returnera val funktion isbitflagset (val flagga) returnera ((val amp flagga) flagga) Definiera dina flaggor definiera MYFLAGONE. 1) 0001 definiera (MYFLAGTWO. 2) 0010 definiera (MYFLAGTHREE. 4) 0100 definiera (MYFLAGFOUR. 8) 1000 gt Jag borde påpeka: dina flaggor lagras i ett enda heltal. Du kan lagra massor av flaggor i ett enda heltal. För att använda mina funktioner, säg att du ville ställa in MYFLAGONE och MYFLAGTHREE, skulle du använda: ltphp myflags setbitflags (MYFLAGONE. MYFLAGTHREE) gt Obs! Du kan skicka setbitflags () så många flaggor som du vill. När du vill testa senare om en viss flagga är inställd, använd t. ex.: ltphp om (isbitflagset (myflags. MYFLAGTWO)) echo MYFLAGTWO är satt gt Den enda knepiga delen definierar dina flaggor. Här är processen: 1. Skriv en lista över dina flaggor 2. Räkna dem 3. Definiera den sista flaggan i din lista som 1 gånger 2 till kraften av ltcountgt minus en. (I. E. 12 (ltcountgt-1)) 3. Arbeta bakåt genom din lista, från sista till första, definierar var och en som hälften av föregående. Du borde nå 1 när du kommer till den första Om du vill förstå binära tal, bitar och bitvis operation bättre, förklarar wikipedia-sidan det bra - en. wikipedia. orgwikiBitwiseoperation. Förhoppningsvis kan detta hjälpa någon att förstå det roliga med Bitwise Operators. Syftet med denna funktion är att returnera ett värde från GPC (Get, Post och Cookie) och göra någon grundläggande formatering till den beroende på VALIDATION-värdet: funktion RETURNSUBMITTEDVALUE (VARIABLE. METHOD. VALIDATION) om (METHOD POST) om (isset (POST VARIABLE)) PORT VARIABLE VALUE POST VARIABLE elseif (METOD COOKIE) om (isset (COOKIE VARIABLE)) COOKIE VARIABLE VALUE COOKIE VARIABLE annars om (isset (GET VARIABLE)) FÅ VARIABEL VÄRDE FÅ VARIABLE om (iniget (magicquotesgpc) true) VALUE-stavning (VALUE) om ((VALIDATION amp 2) 8) VALUE (int) VALUE om ((VALIDATION amp 4) 4) VALUE strtolower (VALUE) om ((VALIDATION amp 2) 2) VALUE striptags VALIDATION amp 1) 1) VALUE trim (VALUE) echo RETURNSUBMITTEDVALUE (ID. GET 8). ltbr gt Konvertera till ett heltal echo RETURNSUBMITTEDVALUE (NAME. GET. 3). ltbr gt Trim Whitespace och Strip HTML-taggar echo RETURNSUBMITTEDVALUE (GENDER. GET. 6). ltbr gt Strip HTML-taggar och konvertera till små bokstäver För de som inte förstår binära är siffrorna du ser inte slumpmässiga, de dubblar varje gång (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024.) som låter dig blanda och matcha den olika funktionen, t. ex. 1 2 3 (Trim Whitespace Strip HTML) 2 4 6 (Strip HTML Konvertera till små bokstäver) Glöm inte de ledande nollorna. Det är väldigt viktigt om du vill skriva en funktion som liknar monteringsinstruktionerna ror och roll (Rotate on Höger och Rotera till vänster), på grund av att dword-värdet roterar binäret alltid tar 32 positioner och innehåller de ledande nollorna Så det här är rätt väg : funktion rotera (decimal) bitar binär decbin (decimal) binär strpad (binär 32. 0. STRPADLEFT) returnera (bindec (substr (binära bitar). substr (binära. 0. bitar))) Se denna monterings kod : mov edx, 1bf5616c ror edx, 8 Efter denna operation: edx 0x6c1bf561 (binär: 110110000011011111010101100001) Men din kod returnerar 0x0d9bf561 (binär: 1101100110111111010101100001) För att få rätt värde måste du lägga till de ledande nollorna genom att lägga till den linjen med strpad () (se ovan). Mycket viktigt Jag hittade 31-bitarsbegränsningen på bitwise ands för att vara lite frustrerande i storskaliga tillståndskontrollapplikationer. Jag har en situation där åtkomst på sidnivå med mer än 50 sidor. Jag kunde klara avgränsningen genom att lägga till en slinga som släppte 31 bitar av höger tills resursidentifieringsbiten ligger inom den första 31. ltphp userlevel session - gt userlevel - 0 subtraktionen säkerställer int typ pgcode pow (2, (pgid - 1)) medan (pgcode gt 2147483648) pgcode pgcode pow (2.31) userlevel session - gt userlevel pow (2.31) om ((userlevel - 0 amp pgcode)) om ej auktoriserad, visa obehörig sidhuvud : Unauthorized. php) exit gt Följande funktion kommer att utföra en 32-bitars vänsterväxling på en 64-bitars maskin: ltphp-funktionen leftshift32 (antal steg) binär decbin (nummer). strrepeat (0. steg) binär strpad (binär 32. 0. STRPADLEFT) binär substr (binär. strlen (binär) - 32) returnera binär 1. - (pow (2.31) - bindec (substr (binär 1) )). bindec (binär) gt
No comments:
Post a Comment