Jump to content

Kā konkrēti izpaužas C++ valodas tuvums "dzelžiem".


Raimonds1
 Share

Recommended Posts

usver, tagad pēc tā garā pentera uzraksti piemēru, kā 256 bitu lielā mainīgajā (pieņemsim, ka tas ir 256 bitu integeris) samainīt vietām bitus. Tā, lai pirmais būtu pēdējais, otrais - pirmspēdējais utt.

 

int RAIMONDS_PERMISSIONS = WHISTLE_MASK & GESTURE_MASK & SMELL_FLOWER_MASK;

 

To arī sūtam, 1 baitā iekļaujas. Un kodā pārbaude šādā veidā:

if ((RAIMONDS_PERMISSIONS & WHISTLE_MASK) > 0) {

// ir tiesības svilpot

}

Pilnīgas muļķības esi sarakstījis.

1kārt - RAIMONDS_PERMISSIONS prasītos "konstruēt" ar OR, nevis ar AND.

2kārt - ja tev RAIMONDS_PERMISSIONS ir "int", tad ļoti iespējams, ka "RAIMONDS_PERMISSIONS & WHISTLE_MASK" būs negatīvs skaitlis pie "atļauts" stāvokļa.

 

Jā, tā ir ar tiem matiem - ja neprot skaldīt, tad labāk turēties no tiem pa gabalu…

Link to comment
Share on other sites

-- 

implementē šito, būs prieks un jēga par izpildītu vingrinājumu. es teiktu, ka lielākā jēga ir izlasīt visu cauri lasīšanas pēc lai zinātu, kas tur vispār ir. un pildīt vingrinājumus, kas katru no lietām mazliet pielieto. un kad vingrinājumi un grāmata beigušies, ķerties pie cilvēkiem noderīgu lietu taisīšanas. vai interesantu utilītu veidošanas. taisot 10x vairāk iegūsi nekā lasot/fantazējot. būs "kā man nokļūt līdz Varakļāniem? Kā pēc tam uz Mazsipāniem?" nevis stāvēt krustcelēs un prātot, kādi ceļi vispār Latvijā ir un kā viņus praktiski pielietot un rezultātā pat ne Varakļānus neredzēt.

 

57N-10.jpg


binary: ui, paldies, | tiešām būtu atbilstošāks. izlaboju kodā. 

 

par baitu limitu jau atrunāju. ikdienā C nerakstu, tāpēc neveidošu pilnībā strādājošu piemēru, ko atliek nokompilēt un palaist. ja ir vēlme, vari sagaidīt, līdz autors uzraksta implementāciju un tad palabot viņa variantu, parādot kornerkeisus.

  • Patīk 1
Link to comment
Share on other sites

Nav jau runa par to, vai tas ir C, Pascal vai kas cits. Tāpat arī neviens (nu vismaz es) neprasa, lai raksti pilnībā strādājošu piemēru. Bet nu pacenties vismaz nerakstīt *kļūdainus* piemērus. AND nomainīts uz OR - tas ir labi. Bet vēl vajadzētu vai nu aizvākt "> 0", vai nu to nomainīt uz "== WHISTLE_MASK", vai vismaz "int" pārdēvēt par "unsigned int". Pretējā gadījumā tas "it kā pareizais piemērs" ir visnotaļ nepareizs, ja vien nav atsevišķi pierakstīts, ka "ar int šajā konkrētajā pseidokodā tiek pieņemts 8 bitus liels unsigned integer".

Link to comment
Share on other sites

Mezavecis

Galvenais nesākt kaut ko šādā stilā - apgāzt matemātiku un bīdīt neeksistējošas teorijas neeksistējošam pielietojumam. Mēs jau vienreiz tam visam izgājām cauri, tāpēc teorijas par bitiem parasti nonāk stupceļā.  

http://www.boot.lv/forums/index.php?/topic/84709-cik-buutiska-ir-statiska-nemainiiga-datu-kopresija-par-25/

http://www.boot.lv/forums/index.php?/topic/107389-binaro-kodu-isinasana-aka-inx/

 

 

Kā tas ietekmē ātrumu?
Link to comment
Share on other sites

Raimonds1

Tas par to domu kas radīsies vai neradīsies, bija par veidu, kā bitwise apraksta tajā C valodas grāmatā. Un proti, ja man priekšā ir 0 un 1 rindiņa, kāda tā ir pirms un pēc pārveidošanas, es to saprotu labāk, nekā pēc teksta -

A.7.14 Logical AND Operator

logical-AND-expression:
inclusive-OR-expression
logical-AND-expression && inclusive-OR-expression
The && operator groups left-to-right. It returns 1 if both its operands compare unequal to zero,
0 otherwise. Unlike &, && guarantees left-to-right evaluation: the first operand is evaluated,
including all side effects; if it is equal to 0, the value of the expression is 0. Otherwise, the right
operand is evaluated, and if it is equal to 0, the expression's value is 0, otherwise 1. 
The operands need not have the same type, but each must have arithmetic type or be a pointer.
The result is int. 
Tas ir stāsts par uztveri - uztvert , kā to lietot no šitā teksta vai no šā - 
programiz.com/c-programming/bitwise-operators

 

 

Mēs jau vienreiz tam visam izgājām cauri, tāpēc teorijas par bitiem parasti nonāk stupceļā.  

 

Dažos procentos gadījumu tā vēlreiz iešana dod rezultātus. 

 

Un vēlreiz - es te koncentrējos uz man individuāli piemērotu mācību procesu, nevis uz jel kādas programmēšanas problēmas risināšanu.


 
 
 
pie tēmas par krāsām uzgāju šo
 
Katrai krāsai daži skaitļi, ko var apstrādāt, tik jāizdomā, kā
Labots - Raimonds1
Link to comment
Share on other sites

usver, tagad pēc tā garā pentera uzraksti piemēru, kā 256 bitu lielā mainīgajā (pieņemsim, ka tas ir 256 bitu integeris) samainīt vietām bitus. Tā, lai pirmais būtu pēdējais, otrais - pirmspēdējais utt.

 

 

lūdzu, rezervēju laiku, atvēru IDE un Tev par prieku darba dienas vidū uzrakstīju programmiņu lai pierādītu, ka neesmu l.ohs un saprotu, par ko ir runa, lai gan esmu kļūdījies sintaksē (paldies par norādēm, es gan kaut kā neplānoju detalizētu mācību materiālu autoram sagatavot, bet aprakstīt pseidokodā). C++ gan, jo C mācījies nekad neesmu, bet C++ pamatus augstskolā pirms padsmit gadiem apguvu.

 

#include <iostream>
#include <bitset>
#include <cstdio>
#include <cmath>

using namespace std;

unsigned short int rev(unsigned short int given) {
	unsigned short int returnValue = 0;
	const int POSITIONS = 15;
	for (int i = POSITIONS; i >= 0; i--){
		if ((int)(given & (int)(pow(2, i))) > 0) {
			returnValue = returnValue | (int)(pow(2,(double(POSITIONS-i))));
		}
	}
	return returnValue;
}

void reverseAndDisplay(unsigned short numba) {
	bitset<16> output = numba; // for output
	cout <<"number: " << numba << " <-- decimal " << endl;
	cout << output << " <-- binary " << endl;
	// reverse
	unsigned short int result = rev(numba);
	output = result;
	cout << output << " <-- reversed" << endl;
	return;
}

int main() {
	unsigned short int initial = 123;
	reverseAndDisplay(initial);
	cout << endl;
	initial = 456;
	reverseAndDisplay(initial);
}

Bet vēl vajadzētu vai nu aizvākt "> 0"

nez, man strādā augšējā kodā vienkārši kāstošana:

 

if ((int)(given & (int)(pow(2, i))) > 0) {

 

autputs šitāds, testu nav un neplānojas:

number: 123 <-- decimal 
0000000001111011 <-- binary 
1101111000000000 <-- reversed

number: 456 <-- decimal 
0000000111001000 <-- binary 
0001001110000000 <-- reversed
Labots - usver
Link to comment
Share on other sites

Raimonds1

 

 

tu skaties nepareizajā lapā

 

Un pareizā ir? Jebkurā gadījumā pašreizējā savā līmenī es vairāk koncentrējos uz uztveres spēju un to, ka sasaistīt visus tos && ^& F97F00 u.c. ķeburus ar bitiem, loģiku, krāsām, skaņām un tamlīdzīgi.

Link to comment
Share on other sites

Mezavecis

Vienmēr pastāv variants ar rūtiņu lapu un zīmuli. Lai krāsu kodu pārvērstu kādā no cipariem, nevajag zināt programmēšanu, pietiek atvērt kalkulatoru. 

 

Tas ir stāsts par uztveri - uztvert , kā to lietot no šitā teksta vai no šā -
Link to comment
Share on other sites

lūdzu, rezervēju laiku, atvēru IDE un Tev par prieku darba dienas vidū uzrakstīju programmiņu lai pierādītu, ka neesmu l.ohs un saprotu, par ko ir runa, lai gan esmu kļūdījies sintaksē

Cerēju uz labāku kodu. Ne sintaktiski (derētu pat pseidokodā), bet idejiski. Uz tādu, kurš nelien ar kaut kādu ciklu cauri katram bitam.

 

nez, man strādā augšējā kodā vienkārši kāstošana:

Vizualizēšu to, ko cenšos pateikt, ar koda piemēru:

int main()
{
    int a = 1 << 31;
    int b = 1 << 31;
    if ((a & b) > 0)
    {
        printf("yupii!\n");
    }
    else
    {
        printf("nope...\n");
    }
}
Vari 3x minēt, kas tiks izdrukāts…
Link to comment
Share on other sites

 Jā, tā ir ar tiem matiem - ja neprot skaldīt, tad labāk turēties no tiem pa gabalu…

 

Tas ir tā, ka ja riepu mainījis esi, bet ikdienā to nedari, tad nakuj s pļaža un pagaidi, līdz atnāk autoservisa džeki, nomazgās mutes un tiem varbūt kaut kad labpatiks atbildēt uz konkrēto jautājumu - kā tas praktiski ir pielietojams. Ja nelabpatiks - nu tad nav lemts autoram uzzināt, kā tas reālajā dzīvē izskatās, pārējie klusiņām stāv pie ratiem ..  :(

 

es tagad darbā no Android runājos ar ārēju hārdvāri. protokols ir ierobežots, ziņojumi starp to aparātu un vadības softu ir dažu integer'u apmērā. lūk, tāds praktiskais pielietojums ilustrācijai (realitātē gan daudz sarežģītāk). C nerakstu ikdienā, bet rakstu Java, kur tieši tās pašas konstrukcijas un operatori un maskas. 

 

Vai Tu varēsi man piedot šādu kļūdīšanos, ka uzrakstīju piemērā pseidokodu, nevis gatavu, standartiem atbilstošu, click&run softu?

 

 

edit: paldies par kornerkeisu ar zīmes maiņu / nulli.

Labots - usver
Link to comment
Share on other sites

Raimonds1

Es par to, ka es te bradāju pa internetu un visam kam uzbrienu. Man nav nekadu nolikumu, darba termiņu vai noteikumu, es pagaidam tikai rotaļājos un laiku pa laikam izdaru secinajumus, piemeēram, vienu un to pašu lietu var uzrakstīt MAN  saprotami un MAN nesaprotami un tāpēc es meklēju, kur tas saprotamais ir ir paslēpies.

 

binary pieminēja manas primitivās 2 krāsu bildes sakarā čipsu kvalitātes kontroli pēc krāsas, tāpēc sameklēju to krāsu tabulu. Pirmā doma - atlliek definēt krāsu pieļaujamās robežas cipariski kadas nu tas taja saitā pec krāsas aprādās un salīdzināt ar bildi.  Tad var tālāk domat par formu, malu, robiem un tamlīdzīgi.

 

Tā protams, nav nekāda programmēšana, bet spriedelēšana par tēmu, tomēr tā diezgan atšķiras no parasta programmēšanas darbu pasūtītāja vai interesenta teksta - jūs man te uztaisiet tādu iekārtu, kas atšķir krāsas. Tas ir kaut kas nedaudz vairāk.


 

 

Vienmēr pastāv variants ar rūtiņu lapu un zīmuli. Lai krāsu kodu pārvērstu kādā no cipariem, nevajag zināt programmēšanu, pietiek atvērt kalkulatoru.   
 
Link to comment
Share on other sites

Un pareizā ir? Jebkurā gadījumā pašreizējā savā līmenī es vairāk koncentrējos uz uztveres spēju un to, ka sasaistīt visus tos && ^& F97F00 u.c. ķeburus ar bitiem, loģiku, krāsām, skaņām un tamlīdzīgi.

Tad ko tu īsti centies atkost? Bitwise operatorus? Boolean operatorus? Skaitļu pierakstu veidus? Derētu tā kā katru lietu atsevišķi saprast, nevis mēģināt "visu" kaut kā nebūt "vizualizēt" ar citas jomas "visu".

(& - bitwise and, && - boolean and)

 

Tas ir tā, ka ja riepu mainījis esi, bet ikdienā to nedari, tad nakuj s pļaža un pagaidi, līdz atnāk autoservisa džeki, nomazgās mutes un tiem varbūt kaut kad labpatiks atbildēt uz konkrēto jautājumu - kā tas praktiski ir pielietojams.

Nē, nevis "nakuj s pļaža", bet drīzāk "nemāci citus, kā jādara, neklausoties, ko tev pašam par to māca".

Tā starp citu - riepas mainījis neesmu, riteņus gan (pieņemot, ka riepa ir tas, ko tipiski apzīmē ar riepu - plika gumija). Vienreiz, mainot riteni, pat pamanījos pirkstu salauzt - ne gluži uz pusēm, bet plaisa kaulā bija, ģipsis uz pāris mēnešiem arī. Būtu bijis tik daudz feināk, ja kāds mani pirms tam būtu pamācījis, kā to nevajag darīt…

 

edit: paldies par kornerkeisu ar zīmes maiņu / nulli.

Nu tad beidzot saprati, kāpēc es tā cepos par to, ka māci cilvēkam "int & int" salīdzināt ar "> 0"? Vairāk tā nedarīsi?

It kā corner case, bet šitādu elementāru mēslu dēļ rodas bugi, kuru dēļ gan uzņēmumi, gan uzņēmumu klienti zaudē tūkstošus. Nu tas tā - labākajā gadījumā… Bēdīgākos gadījumos viss beidzas nevis banku kontos, bet bērēs (gļuki auto softos, piemēram).

Labots - binary
Link to comment
Share on other sites

Raimonds1

Jebkurā gadījumā es no usver teksta sapratu to, ka 1 baitā var ietvert, piemeram, 8 komandas, pieļaujot tām 2 vērtības - darīt vai nedarīt. Un vēl ietvertās bibliotēkas, kāpēc tās tur ir.

 

Ja var, uzraksti kodu čipsu krāsai - 1 punktam.

pēc šī http://www.rapidtables.com/convert/color/index.htm

pieļaujamās vertības  ir no #CFC800 līdz #FFFFBE

 

izejā - 0 -atstāt kastē

vai 1 - pūst prom

 

Ar skaidrojumu, ja var.

Tad ņemsim 8 rindā, tad 64 punktu kvadratu, tad apaļu čipsi ar robiem.

 

Kodu vadīsim no klaviatūras.

Labots - Raimonds1
Link to comment
Share on other sites

ieleja, tā kā nosacījumos bija frāze "256 bitu lielā mainīgajā (pieņemsim, ka tas ir 256 bitu integeris)", tad nē, kompilējamu c/c++ kodu nevarēšu iedot.

Link to comment
Share on other sites

Mezavecis
Raimonds1

Lai operētu ar laukumiem, ir tāda veca laba aizmirsta lieta, kā matricas, kuras augstskolā diezgan plaši iztirzā ar dažādām metodēm. Ar Excel to lieliski var izrēķināt tabulārā veidā, lai nebūtu jāķēpājas ar C un nebūtu uz papīra jāraksta garas formulas. Lūk piemērs ar krāsu korekcijām. Lai pārnestu uz jebkuru programmēšanas valodu, ir jāzina teorija, kuru pašlaik diezgan vāji pārzini. 

http://www.imatest.com/docs/colormatrix/

Link to comment
Share on other sites

Cerēju uz labāku kodu. Ne sintaktiski (derētu pat pseidokodā), bet idejiski. Uz tādu, kurš nelien ar kaut kādu ciklu cauri katram bitam.

 

Tu no manis gaidīji kaut ko līdzīgu kā šis? vai hārdkodētu lookup?

 

 

uint8_t b = byte_to_reverse;

b = ((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;

avots: http://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte

 

 

 

intuitīvi ir 3 varianti:

1) brutāla iterācija pa bitiem

2) lookup sarakstīšana - ja tāds bits/baits, tad pretī būs tāds.. nu un obligāta šiftošana. arī iterācija sanāk - šifts vai nešifts, bet iterācija ir. Trulākajā gadījumā - hārdkodēti (0<-->7. pozīcija utt).

3) maģisko numuru izmantošana (kā augstāk), kurus vai nu zini no galvas, vai arī nezini. nu - sasniedzot noteiktus limitus baitam un tad maģiski pārmetot to otrādi.

 

kādi vēl risinājumi bez iterācijām pa bitiem/baitiem? es tiešām nevienu dienu neesmu pavadījis, žonglējot ar bitiem, konvertēšanām u.c. lietām kā maizes darbu.

 

 

 

Nu tad beidzot saprati, kāpēc es tā cepos par to, ka māci cilvēkam "int & int" salīdzināt ar "> 0"? Vairāk tā nedarīsi?

 

It kā corner case, bet šitādu elementāru mēslu dēļ rodas bugi, kuru dēļ gan uzņēmumi, gan uzņēmumu klienti zaudē tūkstošus. Nu tas tā - labākajā gadījumā… Bēdīgākos gadījumos viss beidzas nevis banku kontos, bet bērēs (gļuki auto softos, piemēram).

 

 

 

paldies - nākamreiz, kad rakstīšu Maserati vadības softu, noteikti atcerēšos. 

Diemžēl es arī vispirms lasu un mācos, tad uztaisu, tad savu spēju līmenī notestēju un tikai tad uzzinu visus iespējamos grābekļus. Nevis atlieku rakstīšanu un kaut kā piedzīvināšanu līdz labākiem laikiem, kad zināšu visu par visu. Manā uztverē tas ir tāds normāls mācību process - arī internetā es labāk redzu StackOverflow 10 pa pusei strādājošus piemērus nekā 0 perfektus. Forši, ka vari pakomentēt ar lielāku pieredzi, pat ja ne visu uzrakstīt uzreiz kā vajag. ja vēl būtu mazliet vairāk lakonisma un pozitīvisma, tad  vispār super būtu  :thumbsup:

Labots - usver
Link to comment
Share on other sites

ieleja, atļaušos uzrakstīt pythonā (nekompilējams, bet ir izpildāms) un paņemt daudz mazāku skaitli - 8 bitus. Ja ir vēlme, tad domu (algoritmu) var saprast.

n = 0b11100010
print "{0:08b}".format(n)

n1 = (n & 0b11110000) >> 4
n2 = (n & 0b00001111) << 4
n = n1 | n2

n1 = (n & 0b11001100) >> 2
n2 = (n & 0b00110011) << 2
n = n1 | n2

n1 = (n & 0b10101010) >> 1
n2 = (n & 0b01010101) << 1
n = n1 | n2

print "{0:08b}".format(n)
Labums tāds, ka 2x lielākam skaitlim vajag nevis 2x vairāk operāciju kā tas ir "naivajā implementācijā" (pārvietot pa vienam vai diviem bitiem), bet par 5 operācijām vairāk (2x and, 2x shift, 1x or).

Tu no manis gaidīji kaut ko līdzīgu kā šis? vai hārdkodētu lookup?

Hārdkodēts lookups 256 bitiem varētu būt smagi…

Līdzīgu kā tas snippets - arī pasmagi, jo faktiski dzelzis operē ar daudz lielākiem skaitļiem nekā nepieciešamais rezultāts.

 

es tiešām nevienu dienu neesmu pavadījis, žonglējot ar bitiem, konvertēšanām u.c. lietām kā maizes darbu.

Es arī neesmu.

 

paldies - nākamreiz, kad rakstīšu Maserati vadības softu, noteikti atcerēšos.

Nevajag nemaz Maserati, pietiek ar opeli, vw vai jebkuru citu lētā gala auto. Jeep/Fiat jau arī nav nekāds luksusa gala auto, bet nu šā gada BlackHatā džeki demonstrēja, kā bez tiešas pieejas Jeep autiņam spējuši to verķi uz lielceļa apstādināt, "ielienot" viņā no interneta caur maģi.

 

Diemžēl es arī vispirms lasu un mācos, tad uztaisu, tad savu spēju līmenī notestēju un tikai tad uzzinu visus iespējamos grābekļus.

Nēnu tas ir normāli, bet es tev uzreiz uzrakstīju, ka (citēju) "iespējams, ka "RAIMONDS_PERMISSIONS & WHISTLE_MASK" būs negatīvs skaitlis pie "atļauts" stāvokļa", tikai tu to spītīgi ignorēji, nevis "lasīji un mācījies". Labots - binary
Link to comment
Share on other sites

iteratīva (lai arī hārdkodēta) šiftošana pa pusbaitiem sākumā - paldies.

 

 

binary, līdz "lasīt un mācīties" šeit ir tālu. šajā topikā es ienācu lai palīdzētu autoram saprast, "kā to pielietot". IMVHO aprakstīju uzskatāmu piemēru ar maskām (ja pats būtu tādu jautājumu uzdevis, tad būtu ļoti priecīgs par tādu ilustrāciju).

Tālāk aizgāja diskusija "vai tas ir foršākais variants un vai kompilēsies uzreiz un strādās visām vērtībām".

Nevis atnācu, lai padziļināti mācītos C datu tipu limitus, veltītu tam laiku un rakstītu vienmēr nemaldīgu kodu. kaut kā vairs nevilina rakt 10 virzienos virspusēji, ja labi zinu, ka man arī 1 maizes darbā ir daudz rokamā (rutīnas fiziski nav). ir daudz lietu, kur neesmu speciālists, bet nullei palīdzēt uz priekšu tikt varu ļoti labi (ir aizdomas, ka autors gan mazāk šajā diskusijā iesaistīts nekā mēs abi :D). ja es nelasītu un nemācītos, tad nebūtu tur, kur esmu tagad (projekti, algas, pieredze). sou .. tiešām nepretendēju apgūt visu un visur virspusēji. man tāpat lietas labi sanāk tikai pēc ilgāka laika ieguldīšanas. Dīl viz it.

 

Nēnu tas ir normāli, bet es tev uzreiz uzrakstīju, ka (citēju) "iespējams, ka "RAIMONDS_PERMISSIONS & WHISTLE_MASK" būs negatīvs skaitlis pie "atļauts" stāvokļa", tikai tu to spītīgi ignorēji, nevis "lasīji un mācījies".

"iespējams, ka "RAIMONDS_PERMISSIONS & WHISTLE_MASK" būs negatīvs skaitlis pie "atļauts"

paldies, rindiņas beigas tiešām neizlasīju.

 

Es arī neesmu.

Tu tiešām neesi strādājis par C un/vai C++ programmētāju, kur baiti, overflow utml ir būtiska darba lieta, vairāk nekā jebkurš API, un kur tādas lietas pēc pusgada jāzina kā savi 5 pirksti? man likās, ka tā ir tāda nozare, kur vairāk prasa nevis API zināšanas, bet datu tipus, algoritmus u.c. zemāka līmeņa lietas. Labots - usver
Link to comment
Share on other sites

Raimonds1

 

 

daudz bitwise triki ir šeit http://www.amazon.co...n/dp/0321842685

 

un šeit

 http://ptgmedia.pearsoncmg.com/images/9780321842688/samplepages/0321842685.pdf

 

nedaudz žilbina visi tie simboli, bet parādās kaut kas pazīstams  


 

 

  45 lapa  tajā PDFā

vienalga, no šā apraksta man tā asociācija radās

 

 

 programiz.com/c-programming/bitwise-operators

Link to comment
Share on other sites

Vizualizēšu to, ko cenšos pateikt, ar koda piemēru:

...

int a = 1 << 31;

Šim koda piemēram ir pilnīgi nedefinēta rīcība C valodā. Tādu kodu nedrīkst rakstīt. Tas tikpat labi "var" formatēt cieto disku :)

 

Citāts iz C99 specifikācijas  (6.5.7 Bitwise shift operators):

 

The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1 x 2E2 , reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1 x 2E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

Tāpēc ka E1 ir signed tips (1) un E2 ir 31, un 1 * 231 vērtība nav reprezentējama rezultāta tipā (signed int), tad "behavior is undefined".

Labots - bubu
  • Patīk 1
Link to comment
Share on other sites

Tu tiešām neesi strādājis par C un/vai C++ programmētāju, kur baiti, overflow utml ir būtiska darba lieta, vairāk nekā jebkurš API, un kur tādas lietas pēc pusgada jāzina kā savi 5 pirksti? man likās, ka tā ir tāda nozare, kur vairāk prasa nevis API zināšanas, bet datu tipus, algoritmus u.c. zemāka līmeņa lietas.

Acīmredzot mēs frāzi "žonglēt ar bitiem, konvertēšanām u.c. lietām" uztveram dažādi.

Šim koda piemēram ir pilnīgi nedefinēta rīcība C valodā. Tādu kodu nedrīkst rakstīt.

My bad :)
Link to comment
Share on other sites

Raimonds1

Kungi, nestrīdamies, patulkojam to Henry S. Warren Hacker"s Delight grāmatu vieglajā valodā.

 

jau sapratu, ka C nav Jūsu mīļākā un ikdienā lietotā valoda.

Link to comment
Share on other sites

Acīmredzot mēs frāzi "žonglēt ar bitiem, konvertēšanām u.c. lietām" uztveram dažādi.

Acīmredzot. Pirmais rezultāts 10sek:

 

Release gadījumā izpildāmajā failā šī informācija netiek iekļauta, jo izpildāmais fails paredzēts gala lietotājam, kuram nekāda debuggošana nav nepieciešama. Tāpat release gadījumā tiek veiktas dažādas optimizācijas, lai izpildāmais fails būtu mazāks un/vai izpildītos ātrāk (piemēram, neiekļauj izpildāmajā failā funkcijas, kas netiek izmantotas; inlaino funkcijas jeb aizvieto funkcijas izsaukumu ar pašas funkcijas saturu; unrollo ciklus jeb aizvieto ciklus ar darbībām, kas atkārtojas; sagrupē darbības, piemēram, darbu ar chariem aizvieto ar darbu ar integeriem; utt). Šīs optimizācijas kompilatori savu bugu dēļ reizēm veic nepareizi. Piemēram, ir bijis, ka kompilators izdzēš kāda CPU 16bit reģistra vērtību, dzēšot atbilstošā 32bit reģistra vērtību, lai arī tajā 16bit reģistrā ir vērtība, kura pēc tam tiek izmantota - visīstākais kompilatora bugs.

Link to comment
Share on other sites

Mezavecis

Pliks C mūsdienu ikdienai vairumā gadījumā nav piemērots. 

Link to comment
Share on other sites

Acīmredzot. Pirmais rezultāts 10sek:

Tai citātā neko neredzu par bitu žonglēšanu un/vai konvertācijām.

 

Es ar "bitu žonglēšanu" uztveru tieši to, kas tur ir uzrakstīts - nevis sajēga, ka signed int un unsigned int ir dažādi datu tipi, bet gan bitu žonglēšana. Piemēram, jau minētā bitu apmaiņa vietām skaitlī (jebšu endianess konvertēšana lielākā skaitlī, tikai tad maina vietām nevis bitus, bet baitus, ko var darīt līdzīgā veidā kā es pirmīt iepostēju). Vai "1" bitu saskaitīšana skaitlī (priekš tam nav jāiet cauri katram bitam). Vai vēl smalkākā līmenī - 0x5f3759df (google it!). Lūk, ko es saprotu ar jēdzienu "bitu žonglēšana". Un neko tādu man ikdienā nesanāk darīt.

 

Ar kaut kādām tur konvertācijām arī ikdienā nenodarbojos, ja nu vienīgi ar C/C++ koda konvertēšanu par bināru failu, piespiežot Ctrl+B (vai kāds nu tur ir tas shortcuts iekš IDE, kas konkrētajā brīdī tiek lietota).

 

Lūk, mazliet par "bitu žonglēšanu" - https://graphics.stanford.edu/~seander/bithacks.html (topika autoram varētu būt interesanta lasāmviela :D)

Labots - binary
Link to comment
Share on other sites

Mezavecis

ieleja

Runa par par reāliem risinājumiem reālā dzīvē, ar ko var nopelnīt algu, nevis to, kurš kurā garāžā kaut ko interesantu ir uzcepis. Un jā, ar vienu lietu nodarboties visu mūžu nav veselīgi. Agri vai vēlu C programmētāji apgreidojas uz kaut ko citu, jo bitus grūstīt 20 gadus ir vēl garlaicīgāk par tiem garlaicīgajiem biznesa risinājumiem.

Link to comment
Share on other sites

Mezavecis, vai tad ar embedded risinājumu izstrādi nevar nopelnīt naudu? Un kā ar spēļu izstrādi? Vai tiešām tu uzskati, ka visādi Blizzardi u.c. neko nenopelna? Ja paskatās, ko tādi "pagrīdes kantori" kā Boeing meklē, tad tur arī visur pēc kārtas C++ figurē. Jebšu viņi nenodarbojas ar "reālu risinājumu" izstrādi?

Link to comment
Share on other sites

Mezavecis

ieleja

Sāksim ar to, cik cilvēku LV strādā Redhat? Man neinteresē Londonas dīvaiņi, kas latviski vairs nespēj runāt bez angliskiem žargoniem, kas jau sen emigrējuši uz neatgriešanos.

Link to comment
Share on other sites

Raimonds1

par bitu grūstīšanu - ir tads dekoderis jacobsons T3 ķīniešu - zviedru kopdarbs

tad nu šis 2 reiz pa garantiju izbeidzās

vispirms - reizēm šis izdomā nelasīt atmiņu

tad - reizēm šis neuztver, ka pults kontaks mehānisku iemeslu dēļ nospiests divreiz - nav aizsardzības pret kontaktu drebelēšanos

ja audio valodas izvēlnē pēc spāņu valodas nospied labo taustiņu, nekādu apli šis vis nemet un nesāk no angļu valodas, bet uzkaras

 

plus pie tā - ražotaji nav paredzējuši, ka tev var būt 2 dekoderi vienā istabā un pultis kofliktē un to sigāli regulē citus dekoderus arī, tik ne tā, kā oriģinālos - kādam bijis slinkums rakstīt jaunus kodus

 

Plus pie tā visa - kad izlasīju, ka šim barošana var būt no 120-240V un pēc otra garantijas maiņas apgreidoju ar parastu trafu, kas pazemina spriegumu pirms barošanas bloka, šis kopš tā laika strādā un nemaitājas

 

Mana hipotēze - kāds kantora darbinieks izdomājis, ka nevajag likt lielāka darba sprieguma kondensatorus, nekā rakstīts uz kontaktdakšas. Tas, ka tas spriegums maiņstrāvai ir efektīvais, ne maksimālais laikam nav bijis zināms. Nu kāpēc gan nelikt barblokam 250 voltus? tas nekas, ka 240x1.4 ir pavisam cits skaitlis

 

Respektīvi - tās zema līmeņa analogas un ciparu lietas taisa problēmas, sevisķi maziem devaisiem ar mazu atmiņu un mazu "procesoru" -kontrolieri

Labots - Raimonds1
Link to comment
Share on other sites

Man neinteresē (..)

Ar to tad arī jāsāk - ar to, ka *tev* neinteresē. Citam gan interesē. Cits atrod arī iespēju izstrādāt "reālus risinājumus" ārzemju klientiem, strādājot no Latvijas. Cits atrod iespēju strādāt ārzemju uzņēmumā, kuram ir filiāle Latvijā. Ir arī indivīdi, kas no Latvijas strādā ārzemju uzņēmumos, kuriem Latvijā [pagaidām] nav filiāles, meitas uzņēmuma. Vēl cits aizbrauc uz to pašu Londonu, Zviedriju, Dāniju vai vēl kādu valsteli tādā kā "pusgadu-gadu ilgā darba ceļojumā" un pēc tam atgriežas - ir gan pastrādājis, gan nopelnījis krietni vairāk nekā tu ar saviem "anti C biznesa risinājumiem", gan apskatījis, kā cilvēki dzīvo citur. Variantu netrūkst, un C/C++ ir un būs pieprasīts - gan Latvijā, gan ārpus tās. Un nopelnīt ar to var gana daudz, vajag tikai gribēt un mācēt, nevis truli apgalvot, ka "C ir vēsture un vairs nekam neder". Jā, un C/C++ - tas IR interesanti.
Link to comment
Share on other sites

Raimonds1

 

 

Ar Excel to lieliski var izrēķināt tabulārā veidā, lai nebūtu jāķēpājas ar C un nebūtu uz papīra jāraksta garas formulas. Lūk piemērs ar krāsu korekcijām. Lai pārnestu uz jebkuru programmēšanas valodu, ir jāzina teorija, kuru pašlaik diezgan vāji pārzini. 

 

Mana problema kā reiz ir tā, ka manis izvēlētajam ceļam tikt tajā C valodā no bitu un loģiakas funkciju puses nav tā sākuma līmeņa skaidrojumu. 

Link to comment
Share on other sites

Mezavecis
binary

Padalies ar tiem uzņēmumiem, citādi te visi lielās ar mega klientiem un mega darbiem, bet realitātē tikai spēlējās garāžā un forumos skalda matus ar bitiem.

 

Bet, kas notiek Amerikā, mani tiešām neinteresē. Un par nopelnīšanu arī bieži vien stāsts ir uzpūsts. Lai daudz nopelnītu, ir daudz jāstrādā. 

Link to comment
Share on other sites

Padalies ar tiem uzņēmumiem, citādi te visi lielās ar mega klientiem un mega darbiem, bet realitātē tikai spēlējās garāžā un forumos skalda matus ar bitiem.

 

Bet, kas notiek Amerikā, mani tiešām neinteresē. Un par nopelnīšanu arī bieži vien stāsts ir uzpūsts. Lai daudz nopelnītu, ir daudz jāstrādā.

Nav jau tā, ka par visu var tā brīvi runāt. Paraksti NDA, tad arī varēsi piekļūt informācijai par mega klientiem un mega darbiem.

Ja par ārzemju uzņēmumiem Latvijā, tad pats esmu strādājis Point Transaction Systems (šobrīd nu jau Verifone pārpirkts), Ingenico, šobrīd strādāju whiteCryption. Kāds radinieks gadu pastrādāja Sony Zviedrijā. Nu tas tā, publiski pieejama informācija (kaut vai tai pašā linkedinā). Ir arī tāda, par kuru forumos skaļi nerunā.

Lai daudz nopelnītu, tiešām IR jāstrādā, bet tas ir neatkarīgi no tā, kurā valstī tas notiek. Bet nu cik man zināms, par vienu un to pašu darbu dažādās valstīs maksā dažādi. Ne velti ārzemju uzņēmumi ver vaļā filiāles valstīs, kurās ir lētāks darba spēks (jā, arī tai pašā Latvijā).

Link to comment
Share on other sites

 

 

Padalies ar tiem uzņēmumiem, citādi te visi lielās ar mega klientiem un mega darbiem
 

 

http://www.top101.lv/lv/top101/2014

19. vietā - Mikrotīkls. Kā nosaukums vēsta, tas ir mazs interneta provaideris, ja kāds par to dzirdējis. Kā jau interneta provaideri, viņi ar linukšiem aizrāvušies..

 

tbl-460.png


Diezgan daudz ir risinājumu, kur iesaistītās puses nav tikai PC un serveris. Nu un tam visam vajag kaut kādu softu. Manā parakstā ir viens uzņēmums, uz tā linka var uzklikot un paskatīties dažādu hārdvāri. Rīga, Saules akmens. Cita lieta, ka tādiem risinājumiem ir jābūt masveidā ražojamiem (nederēs 2 sejas kā klienti un vēl 10 firmiņas sameklēs gada laikā, lai pietiktu algām).


 

 

šobrīd strādāju whiteCryption
 

tad nenomainīji neko?

Link to comment
Share on other sites

Mezavecis

Lietot linux un programmēt iekš linux nav tas pats, turklāt linux lietošana nenozīmē, ka automātiski kāds kaut ko tur taisa C. Tikpat labi Java vai Pyton var būt. Mums no visa lielā programmētāju bara tikai daži kodē C priekš dzelžiem, un arī tikai fragmentāri, nevis pilnu laiku 160h mēnesī. 

Link to comment
Share on other sites

tad nenomainīji neko?

Nomainīju. Uz 3 mēnešiem (Ingenico). Sapratu, ka šajā dzīves posmā darbs whiteCryptionā man piemērotāks un interesantāks.
Link to comment
Share on other sites

Inspektors Caps

uzrakstīju programmiņu lai pierādītu, ka neesmu l.ohs un saprotu, par ko ir runa

unsigned short int rev(unsigned short int given) {
    unsigned short int returnValue = 0;
    const int POSITIONS = 15;
    for (int i = POSITIONS; i >= 0; i--){
        if ((int)(given & (int)(pow(2, i))) > 0) {
            returnValue = returnValue | (int)(pow(2,(double(POSITIONS-i))));
        }
    }
    return returnValue;
}

Un Tu sevi sauc programmētāju? Es nerunāju par sintaksi, ja tur arī ir kāda kļūda, mainīgo nosaukumiem vai citām figņām. Arī ne par pašu ideju, ko @@binary parādīja labāku, bet tieši par idejas "cikls, kas maina bitus pa vienam" realizācijas principiem.

 

Vispirms par to, ko te jau teica. Fakts, ka Tev labu laiku nepieleca, ka signed mainīgā kreisais malējais bits ir zīmes bits, jau vien ir ko vērts, bet tagad no cita skatu punkta. Kas tā par padebīlu ideju loģiskajai salīdzināšanai izmantot >0? Un kas tad ir <0? C tipa valodām un visiem aktuālajiem procesoriem ir skaidri noteikts, ka 0 ir false, bet JEBKAS cits ir true! Un, ja jau gribās rakstīt bezjēdzīgi garu kodu, lai priekšnieka acīs izskatītos krutāks, tad kur problēma to tieši tā korekti arī rakstīt ar ==0 vai !=0? Būs vēl par simbolu vairāk! Bet, ja izņemam to nulli un jebkā likšanu iekavās bez sajēgas, tad tā rinda pārvēršas par:

        if ((int)given & (int)pow(2, i)) {

Bet tālāk nāk totāls smadzeņu armagedons - pow() izmantošana bitiem. Šo nevar raksturot kā "neoptimālu" kodu, bet gan kā "deoptimizētu" dēļ slimām smadzenēm. Pirmkārt, kas ir pow()? Reālu skaitļu kāpināšana, kas saņem un atgriež double tipu (konvertēt turp-atpakaļ jau ir padebīli), kas izpildās daudz (un tas ir ĻOTI maigi teikts) lēnāk. Reālu skaitļu pakāpe tiek iegūta ar naturāllogaritma un eksponentfunkcijas palīdzību, kas katrs iegūts ar Teolora rindas palīdzību. Tas ir cikls ar n-tajām double operācijām katrā iterācijā! Un priekš kam tas viss? Izrādās, ka, lai kāpinātu VESELUS skaitļus. Ak nē, izrādās, ka pat, lai iegūtu divnieka pakāpes! Bet priekš kam mums vispār vajadzēja tās? Ā, lai iegūtu int, kam attiecīgais pēc kārtas bits ir 1. Laikam jau no mūsdienu programmētāja sagaidīt pat bitu pārbīdi ir par daudz prasīts, nerunājot nemaz par to, ka programmētājam jau nu vajadzētu zināt, ka binārajā sistēmā bitu pārbīde ir tā pati reizināšana/dalīšana ar 2. Gluži tāpat kā decimālajā sistēmā "komata pārbīdīšana" pa kreisi/labi ir reizināšana/dalīšana ar 10. Te noteikti vajadzēja iesaistīt <cmath> biblotēku! Bet, ieslēdzot smadzenes, iegūstam:

        if ((int)given & (1<<i)) {
            returnValue |= 1 << (POSITIONS-i);
        }

Skatoties uz visu if-u kopumā, rodas pārdomas.. Tiek veikta bitu pārbīde, binārais AND un salīdzināšana, lai iespējams ietaupītu... atņemšanu, bitu pārbīdi un bināro OR. Hmm! Bitu pārbīde un binārās operācijas savā starpā ir faktiski vienāda ilguma, bet salīdzināšana kopā ar iespējamo JUMP pilnīgi noteikti vidēji ir ilgāka dēļ vairāk operācijām un CPU pipeline pārlādes. Labi, pieņemam pat, ka šo 3 operāciju komplekti ir vienāda ātruma - x. Pieņemam arī, ka vidēji puse bitu ir 1. Vidējais laiks sanāks 8*2x+8*x = 24x. Savukārt, ja mēs kodu realizētu tā, ka varam bitus piešķirt neatkarīgi no to vērtības, tad laiks sanāktu 16x. Varam tos vienkārši no viena gala bīdīt ārā/iekšā. Un arī mainīgais given mums tālāk vairs nav vajadzīgs, tādēļ varam mainīt to, nevis taisīt jaunu. Tātad if-s izzūd vispār:

    for (int i = POSITIONS; i >= 0; i--){
        returnValue <<= 1;
        returnValue |= given & 1;
        given >>= 1;
    }

Kaut kā arī vairs nav jēgas konstantei POSITIONS. Ciklu vispār arī no paša sākuma jau nebija nekādas vajadzības NErakstīt vairāk pierastajā skaitītāja palielināšanas formā. Tātad beigās ieguvām:

unsigned short int rev(unsigned short int given) {
    unsigned short int returnValue = 0;
    for (int i=0; i<16; i++) {
        returnValue <<= 1;
        returnValue |= given & 1;
        given >>= 1;
    }
    return returnValue;
}
es tagad darbā no Android runājos ar ārēju hārdvāri. protokols ir ierobežots, ziņojumi starp to aparātu un vadības softu ir dažu integer'u apmērā. ... C nerakstu ikdienā, bet rakstu Java, kur tieši tās pašas konstrukcijas un operatori un maskas.

Kad nākošreiz gribās kopā ar citiem foruma diletantiem stāstīt, ka programmēšanas valodai nav nozīmes, neviena neierobežo izpratni un padebīlā Java nesajāj domāšanu, tad pārlasi šo postu un padomā vai vajag sevi taisīt par tādu, kā pats teici, l.ohu tikai tādēļ, ka gan foruma, gan dzīves l.ohu korī apkārt ir simtiem tādu pašu piedziedātāju.

 

 

 

ja es nelasītu un nemācītos, tad nebūtu tur, kur esmu tagad (projekti, algas, pieredze). sou ..

Par lasīšanu un mācīšanos nezinu, bet galvenais ir parādīts pilnīgi skaidri - operatoros, maskās, datu formātos, protokolos un programmēšanā vispār Tu esi apaļa nulle. Absolūts pirmskursnieka mājas darbu līmenis, ne augstāk. Un, ja Tev ir "projekti, algas", bet sajēgas nav, tad tādus sauc par diletantiem. Šis arī lieliski parāda to, kāds ir vispārējais Latvijas uzņēmumu, to darbinieku un tādēļ arī produktu līmenis.

 

P.S. Ja pareizi saprotu, tad autoram @@Raimonds1 vēl ar vien nav pielecis, ka BMP ielasīts atmiņā ir vienkārši pikseļu masīvs un ar to var darīt visu, ko vien ar skaitļiem var darīt? Vai viņš vēl nav ticis līdz tam, ka pikselis ir trīs RGB skaitļi, kas apzīmē krāsu intensitātes?

Labots - Inspektors Caps
Link to comment
Share on other sites

 

 

Lietot linux un programmēt iekš linux nav tas pats, turklāt linux lietošana nenozīmē, ka automātiski kāds kaut ko tur taisa C.
 

 

Reizēm brīnos par tavu redzesloka plašumu.

Pirmkārt, tam "interneta provaiderim" ir daudz dažādu risinājumu. Kam nepietiek tikai uzražot dzelzi pie ķīniešiem un - vuaļā, mistiskā kārtā viņš strādā. Un vai RouterOS ir dzirdēts? tas tomēr nav gluži linuksis. Nu nevar dzīvot hārdvāres ražotājs ar parastu linuksi.

http://www.ditf.rtu.lv/sites/default/files/slud/Mikrotik_Cprogrametajs_aktuals.pdf

 

o, caps ieradās izpaust savu viedumu :)


vakar jau gaidīju, kad kāds sāks bļaut par math inklūdošanu šifta vietā kāpināšanai fiksā piemērā - nav optimāls, nav refaktorēts, es ša 10x labāk uzrakstīšu.. šodien atradās viens betona stila brīnums.

vēl papīksti par to, ka cstdio inklūds lieks :)

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...