Seri Tutorial Bahasa C – Bagian 4: Melakukan Operasi-operasi

Artikel ini menunjukkan bagaimana operator-operator C digunakan untuk memanipulasi data dalam sebuah program C.

Catatan:

  • Silahkan Anda mengeklik icon menu     untuk berpindah subbagian.
  • Video pelengkap dalam tutorial ini akan lebih jelas dilihat dengan resolusi 720p dan mode Full screen.
4.1. Melakukan Operasi Aritmetika
4.2. Menyematkan Nilai-nilai
4.3. Membandingkan Nilai-nilai
4.4. Menilai Logika
4.5. Memeriksa Kondisi-kondisi
4.6. Menghitung Alokasi Memori
4.7. Membandingkan Nilai-nilai Bit
4.8. Menandai Bit-bit
4.9. Memahami Pengutamaan
4.10. Ringkasan

4.1. Melakukan Operasi Aritmetika

Operator-operator yang biasa digunakan dalam program-program C ditampilkan dalam tabel di bawah ini dengan penjelasan operasi yang mereka lakukan.

Operator Operasi
+ Penambahan
- Pengurangan
* Perkalian
/ Pembagian
% Modulus
++ Penambahan satuan nilai (increment)
-- Pengurangan satuan nilai (decrement)

Operator untuk penambahan, pengurangan, perkalian, dan pembagian tentunya akan bekerja seperti yang Anda harapkan untuk operasi yang bersesuaian. Untuk diperhatikan, penggunaan tanda kurung pada sebuah operasi dengan lebih dari satu operator akan sangat berguna untuk memperjelas operasinya:

a = b * c - d % e / f ; /* ini tidak jelas */ 
a = ( b * c ) - ( ( d % e ) / f ) ; /* ini lebih jelas */ 

Operator modulus % membagi bilangan pertama dengan bilangan kedua dan memberikan keluaran berupa nilai sisa operasi. Hal tersebut berguna untuk menentukan jika sebuah bilangan nilainya berupa ganjil atau genap.

Operator penambah cacah ++ dan operator pengurang cacah -- mengubah nilai bilangan satu satuan dan keluarannya berupa nilai yang baru. Ini sangat sering digunakan untuk mencacah iterasi dalam sebuah perulangan. Operator penambah cacah akan menambah nilai satu satuan dan operator pengurang cacah akan mengurangi nilai satu satuan juga.

Operator penambah dan pengurang cacah dapat diletakkan sebelum atau sesudah operand 1 untuk memberikan efek yang berbeda. Jika ditempatkan sebelum operand (prefiks) maka nilainya diubah seketika, namun jika ditempatkan setelah operand (posfiks) maka nilainya dikenali dulu baru kemudian diubah.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar. Penulis memberi nama berkas program: kode-1_bab-4.c.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi utama main() yang mendeklarasikan dan menginisialisasi beberapa variabel bilangan bulat.

    int main()
    {
        int a = 4 , b = 8 , c = 1 , d = 1 ;
    }
  3. Selanjutnya dalam blok fungsi main(), keluarkan hasil operasi aritmatika pada nilai-nilai variabel.

    printf( "Penambahan: %d \n" , a + b ) ;
    printf( "Pengurangan: %d \n" , a - b ) ;
    printf( "Perkalian: %d \n" ,  a * b ) ;
    printf( "Pembagian: %d \n" , b / a ) ;
    printf( "Modulus: %d \n" , a % b ) ;
  4. Sekarang dalam blok fungsi main(), keluarkan hasil-hasil operasi penambahan cacah posfiks dan prefiks.

    printf( "Penambahan satuan posfiks: %d \n" , c++ ) ;
    printf( "Nilai penambahan satuan posfiks sekarang: %d \n" , c ) ;
    printf( "Penambahan satuan prefiks: %d \n" , ++d ) ;
    printf( "Nilai penambahan satuan prefiks: %d \n" , d ) ;
  5. Pada akhir blok fungsi main() keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.

    return 0 ;
  6. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat hasil-hasil operasi aritmatika.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.1. Melakukan Operasi Aritmetika dalam Bahasa C.

4.2. Menyematkan Nilai-nilai

Operator-operator yang digunakan dalam bahasa C untuk menyematkan nilai-nilai ditampilkan dalam tabel di bawah ini. Semua kecuali operator penyemat sederhana “=” merupakan bentuk ringkas dari ungkapan yang lebih panjang.

Operator Contoh Ekuivalen
= a = b a = b
+= a += b a = ( a + b )
-= a -= b a = ( a - b )
*= a *= b a = ( a * b )
/= a /= b a = ( a / b )
%= a %= b a = ( a % b )

Hal yang perlu digarisbawahi, operator “=” memiliki makna “menyematkan” dan bukannya “sama dengan” agar tidak keliru makna dengan operator persamaan “==“.

Dalam contoh di atas, variabel bernama a disematkan nilai yang terkandung di dalam variabel bernama b sehingga menjadi nilai baru yang disimpan di variabel a.

Operator += berguna untuk menambah sebuah nilai ke dalam nilai terkini yang disimpan di variabel a. Dalam contoh tabel, operator += pertama-tama menambahkan nilai yang tersimpan di variabel a ke nilai yang tersimpan di variabel b. Kemudian, operasi tersebut menghasilkan nilai untuk menjadi nilai baru yang disimpan di variabel a.

Semua operator lain dalam tabel berkerja dengan cara yang sama dengan membuat operasi aritmetis di antara dua nilai pertama, kemudian memberikan hasilnya ke variabel pertama untuk menjadi nilai baru yang disimpan.

Untuk operator %=, operand pertama a dibagi dengan operand kedua b kemudian sisa operasi tersebut disematkan ke variabel a.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dua variabel bilangan bulat.

    int main()
    {
        int a , b ;
    }
  3. Selanjutnya, dalam blok fungsi main() keluarkan hasil-hasil operasi penyematan yang dilakukan pada variabel-variabel.

    printf( "Sematkan: \n" ) ;
    
    printf( "\tVariabel a = %d \n" , a = 8 ) ;
    printf( "\tVariabel b = %d \n" , b = 4 ) ;
    
    printf( "Tambahkan dan sematkan: \n" ) ;
    printf( "\tVariabel a += b ( 8 += 4 ) a = %d \n" , a += b ) ;
    
    printf( "Kurangi dan sematkan: \n" ) ;
    printf( "\tVariable a -= b ( 12 -= 4 ) a = %d \n" , a -= b ) ;
    
    printf( "Kalikan dan sematkan: \n" ) ;
    printf( "\tVariabel a *= b ( 8 *= 4 ) a = %d \n" , a *= b ) ;
    
    printf( "Bagi dan sematkan: \n" ) ;
    printf( "\tVariabel a /= b ( 32 /= 4 ) a = %d \n" , a /= b ) ;
    
    printf( "Moduluskan dan sematkan: \n" ) ;
    printf( "\tVariabel a %%= b ( 8 %%= 4 ) a = %d \n" , a %= b ) ;
  4. Pada bagian akhir fungsi main() keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan dalam deklarasi awal fungsi tersebut.

    return 0 ;
  5. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat hasil-hasil operasi penyematan.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.2 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.2. Menyematkan Nilai-nilai dalam Bahasa C.

4.3. Membandingkan Nilai-nilai

Operator-operator yang biasa digunakan dalam pemrograman C untuk membandingkan dua nilai numeris disajikan dalam tabel di bawah ini:

Operator Uji Perbandingan
== Persamaan
!= Pertidaksamaan
> Lebih besar dari
< Lebih kecil dari
>= Lebih besar atau sama dengan
<= Lebih kecil atau sama dengan

Operator persamaan == membandingkan dua operand dan akan memberikan nilai 1 (benar) jika keduanya bernilai sama, sebaliknya akan memberikan nilai 0 (salah). Apabila keduanya adalah angka yang sama maka mereka dianggap sama, atau apabila keduanya merupakan karakter maka nilai kode ASCII-nya yang dibandingkan secara numeris.

Sebaliknya dengan menggunakan aturan seperti pada operator persamaan ==, untuk operator pertidaksamaan != maka akan memberikan nilai 1 (benar) jika dua operand tidak sama, dan mengembalikan nilai 0 (salah) jika nilainya sama.

Operator persamaan dan pertidaksamaan berguna dalam menguji keadaan dua variabel untuk melakukan pencabangan kondisional dalam sebuah program.

Operator “lebih besar dari” > membandingkan dua operand dan akan memberikan nilai 1 (benar) jika nilai pertama lebih besar dari nilai kedua, atau memberikan nilai 0 (salah) jika yang pertama nilainya sama atau lebih kecil dari yang kedua. Operator “lebih besar dari” > sering digunakan untuk menguji nilai sebuah cacah mundur (countdown) dalam sebuah perulangan.

Operator “lebih kecil dari” < membuat perbandingan yang sama namun memberikan nilai 1 (benar) jika operand pertama memiliki nilai lebih kecil dari nilai kedua, sebaliknya akan memberikan nilai 0 (salah).

Menambahkan operator = setelah operator “lebih besar dari” > atau “lebih kecil dari” < akan memberikan nilai 1 (benar) saat dua operand nilainya tepat sama.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi tiga variabel bilangan bulat dan dua variabel karakter.

    int main()
    {
        int v__nol = 0 , v__nil = 0 , v__satu = 1 ;
        char v__huruf_besar = 'A' , v__huruf_kecil = 'a' ;
    }
  3. Selanjutnya, dalam blok fungsi main() keluarkan hasil-hasil operasi perbandingan yang dilakukan pada variabel-variabel.

    printf( "Persamaan ( 0 == 0 ): %d \n" , v__nol == v__nil ) ;
    printf( "Persamaan ( 0 == 1 ): %d \n" , v__nol == v__satu ) ;
    printf( "Persamaan ( A == a ): %d \n" , v__huruf_besar == v__huruf_kecil ) ;
    printf( "Pertidaksamaan ( A != a ): %d \n" , v__huruf_besar != v__huruf_kecil ) ;
    
    printf( "Lebih besar dari ( 1 > 0 ): %d \n" , v__satu > v__nil ) ;
    printf( "Lebih kecil dari ( 1 < 0 ): %d \n" , v__satu < v__nil ) ;
    
    printf( "Lebih besar atau sama dengan ( 0 >= 0 ): %d \n" , v__nol >= v__nil ) ;
    printf( "Lebih kecil atau sama dengan ( 1 <= 0 ): %d \n" , v__satu <= v__nil ) ;
  4. Pada akhir blok fungsi main() keluarkan sebuah bilangan bulat bernilai nol seperti yang disyaratkan dalam deklarasinya.

    return 0 ;
  5. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat hasil-hasil operasi perbandingan.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.3 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.3. Membandingkan Nilai-nilai dalam Bahasa C.

4.4. Menilai Logika

Operator logika paling banyak digunakan dalam sebuah pemrograman bahasa C dan ditampilkan dalam tabel berikut:

Operator Operasi
&& Logika AND
|| Logika OR
! Logika NOT

Operator-operator logika digunakan bersama dengan operand yang memiliki nilai boolean benar (true) atau salah (false), atau sebuah ungkapan yang bisa mengubah menjadi nilai yang benar atau salah.

Logika operator && AND akan mengevaluasi dua operand dan memberikan nilai benar hanya jika kedua operand tersebut bernilai benar. Sebaliknya, operator && AND akan memberikan nilai salah (false).

Hal tersebut digunakan dalam pencabangan kondisional tempat arah sebuah program C ditentukan dengan menguji dua kondisi. Apabila kedua kondisi terpenuhi maka program akan berjalan ke arah tertentu, sebaliknya ia akan mengambil arah yang berbeda.

Tidak seperti operator && AND yang membutuhkan kedua operand bernilai benar, operator || OR akan menilai dua operand dan memberikan nilai benar apabila salah satu operator bernilai benar. Apabila kedua operand tidak bernilai benar maka operator || OR akan memberikan nilai salah. Hal ini berguna dalam pemrograman C untuk melakukan sebuah aksi tertentu jika salah satu atau kedua kondisi yang diuji telah sesuai dengan apa yang diinginkan.

Logika ketiga, yaitu operator ! NOT merupakan sebuah operator “unary” yang digunakan sebelum operand tunggal. Ia memberikan nilai kebalikan untuk operand yang digunakan, sehingga apabila variabel v__var bernilai benar maka !v__var akan memberikan sebuah nilai salah.

Operator ! NOT berguna untuk mengganti nilai sebuah variabel dalam iterasi-iterasi perulangan berurut dengan menggunakan pernyataan v__var = !v__var. Hal tersebut menjamin pada setiap iterasi nilainya dibalik, seperti halnya mematikan dan menyalakan sebuah lampu listrik dengan menggunakan sakelar kontak.

Dalam pemrograman C, sebuah bilangan nol mewakili nilai boolean yang salah dan nilai apa saja yang tidak bernilai nol, seperti misalnya 1 mewakili nilai boolean yang benar.

  1. Mulailah sebuah program baru dengan mengikutsertakan sebuah instruksi prapemroses fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi dua variabel bilangan bulat.

    int main()
    {
        int v__ya = 1 , v__tidak = 0 ;
    }
  3. Selanjutnya dalam blok fungsi main(), keluarkan hasil-hasil operasi logika yang dilakukan pada variabel-variabel.

    printf( "AND ( v__tidak && v__tidak ): %d \n" , v__tidak && v__tidak ) ;
    printf( "AND ( v__ya && v__tidak ): %d \n" , v__ya && v__tidak ) ;
    printf( "AND ( v__ya && v__ya ): %d \n" , v__ya && v__ya ) ;
    
    printf( "OR ( v__tidak || v__tidak ): %d \n" , v__tidak || v__tidak) ;
    printf( "OR ( v__ya || v__tidak ): %d \n" , v__ya || v__tidak ) ;
    printf( "OR ( v__ya || v__ya ): %d \n" , v__ya || v__ya ) ;
    
    printf( "NOT ( v__ya !v__ya): %d %d \n" , v__ya , !v__ya ) ;
    printf( "NOT ( v__tidak !v__tidak ): %d %d \n" , v__tidak , !v__tidak ) ;
  4. Pada akhir blok fungsi main() keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan pada saat pendeklarasian fungsi.

    return 0 ;
  5. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat hasil-hasil operasi logika.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.4 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.4. Menilai Logika dalam Bahasa C.

4.5. Memeriksa Kondisi-kondisi

Kemungkinan, operator uji yang paling disukai para pemrogram C adalah operator kondisional ?:, dikenal juga sebagai operator “ternary“. Operator tersebut pertama kali akan menilai sebuah ekspresi untuk nilai boolean benar atau salah kemudian mengeksekusi satu dari dua pernyataan tergantung pada hasil evaluasi.

Operator kondisional memiliki sintaks sebagai berikut:

( ekspresi-uji ) ? jika-benar-lakukan-ini : jika-salah-lakukan-ini ;

Operator ini dapat digunakan untuk mengevaluasi apakah sebuah bilangan yang diberikan merupakan bilangan ganjil ataukah genap dengan memeriksa jika ada sisa setelah melakukan pembagian dengan bilangan dua, kemudian mengeluarkan kalimat yang sesuai seperti berikut:

( 5 % 2 != 0 ) ? printf( "Bilangan ganjil." ) : printf( "Bilangan genap." ) ; 

Dalam kasus tersebut, dengan membagi bilangan lima terhadap dua tidak akan meninggalkan sisa nol sehingga ungkapan tersebut bernilai benar. Selanjutnya, pernyataan pertamalah yang akan dieksekusi, menjelaskan dengan tepat bahwa bilangan tersebut sebagai sebuah bilangan ganjil.

Operator kondisional juga berguna untuk menjamin tata bahasa yang tepat dalam bahasa Inggris untuk mengeluarkan satuan tunggal dan jamak sehingga menghindari frase yang aneh seperti “There is 5“. Evaluasi dapat dibuat secara sederhana di dalam pernyataan printf():

printf( "There %s %d" , ( v__bilangan == 1) ? "is" : "are" , v__bilangan ) ;

Dalam kasus tersebut, saat variabel v__bilangan bernilai benar maka versi yang digunakan adalah “is”, sebaliknya yang digunakan adalah “are”.

Operator kondisional juga dapat digunakan untuk menyematkan nilai yang sesuai ke sebuah variabel bergantung pada hasil sebuah evaluasi. Apabila demikian maka sintaksnya berupa:

variabel = ( ekspresi-uji ) ? bila-benar-sematkan-ini : bila-salah-sematkan-ini ;

Operator tersebut, sebagai contoh, digunakan untuk mengevaluasi apakah sebuah nilai yang diberikan memiliki nilai lebih besar daripada lainnya kemudian menyematkan nilai yang lebih besar ke sebuah variabel, seperti berikut:

int v__bilangan , v__a = 5 , v__b = 2 ;
v__bilangan = ( v__a > v__b ) ? v__a : v__b ;

Dalam kasus tersebut, nilai variabel v__a lebih besar daripada variabel v__b, sehingga variabel v__bilangan disematkan nilai yang lebih besar, yaitu 5.

  1. Mulailah sebuah program baru dengan mengikutsertakan sebuah instruksi prapemroses fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi sebuah variabel tunggal bilangan bulat.

    int main()
    {
        int v__bilangan = 7 ;
    }
  3. Selanjutnya, pada blok fungsi main(), masukkan sebuah pernyataan kondisional untuk mengeluarkan paritas nilai variabel.

    ( v__bilangan % 2 != 0 ) ?
    printf( "%d bernilai ganjil\n" , v__bilangan ) : printf( "%d bernilai genap\n", v__bilangan ) ;
  4. Sekarang masukkan pernyataan kondisional untuk mengeluarkan sebuah frase yang menggunakan tatabahasa Inggris jamak yang benar.

    printf( "There %s" , ( v__bilangan == 1 ) ? "is" : "are" ) ;
    printf( "%d %s\n" , v__bilangan , ( v__bilangan == 1 ) ? "apple" : "apples" ) ;
  5. Kurangi nilai variabel kemudian masukkan pernyataan kondisional untuk mengeluarkan sebuah frase singularitas yang benar.

    v__bilangan = 1 ;
    printf( "There %s" , ( v__bilangan == 1 ) ? "is" : "are" ) ;
    printf( "%d %s\n" , v__bilangan , ( v__bilangan == 1 ) ? "apple" : "apples" ) ;
  6. Pada akhir blok fungsi main() keluarkan nilai sebuah bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  7. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat hasil-hasil operasi kondisional.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.5 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.5. Memeriksa Kondisi-kondisi dalam Bahasa C.

4.6. Menghitung Alokasi Memori

Dalam pemrograman C, operator sizeof mengeluarkan nilai sebuah bilangan bulat, yang merupakan banyak bytes yang dibutuhkan untuk menyimpan isi operand dalam memori.

Saat operand dikenakan operator sizeof yang berupa nama tipe data maka operand tersebut harus berada di dalam tanda kurung.

Sebagai alternatif, apabila operand berupa sebuah nama objek data, misalnya nama sebuah variabel, maka tanda kurung tersebut bisa ditiadakan. Dalam praktiknya, banyak pemrogram akan selalu mengurung operand yang dikenakan operator sizeof dalam tanda kurung untuk menghindari mengingat-ingat perbedaan tersebut.

Unit penyimpanan dasar dalam C didefinisikan oleh tipe data char yang menyimpan karakter tunggal dalam byte tunggal memori. Itu maknanya bahwa sizeof( char ) akan selalu mengeluarkan nilai 1 (satu byte).

Secara umum, tipe data int dan float akan masing-masing mengalokasikan 4 bytes dalam memori mesin, sedangkan tipe data double akan mengalokasikan 8 bytes untuk menampung rentang nilainya yang mungkin. Ukuran tersebut tidak dijelaskan secara standar sehingga nilainya bisa beragam. Oleh karena itu, merupakan sebuah praktik yang baik untuk menggunakan operator sizeof() guna mengukur alokasi memori aktual daripada mengasumsikan ukuran umum tersebut.

Ruang memori yang dialokasikan untuk variabel larik merupakan banyak byte yang dialokasikan untuk tipe data variabel tersebut dikalikan banyaknya anggota dalam larik tersebut. Jadi, sebagai contoh, untuk ungkapan sizeof( int[3] ) maka umumnya akan memberikan nilai 12 (3 × 4 bytes).

Operator sizeof() sangat penting digunakan untuk menemukan secara akurat banyak memori yang dialokasikan untuk struktur yang didefinisikan sendiri oleh pemrogram yang memiliki anggota dengan tipe data yang berbeda, mengingat “spasi” sering ditambahkan secara otomatis. Itu artinya bahwa alokasi memori total bisa jadi melampaui jumlahan alokasi untuk masing-masing anggota.

Kelihatannya masuk akal untuk menganggap sebuah struktur yang beranggotakan variabel int v__skor dan char v__peringkat akan dialokasikan memori total sebanyak 5 bytes, namun alokasi totalnya akan sebanyak 8 bytes. Itu karena sistem komputer (32-bit) melakukan operasi membaca dan menulis data dalam kepingan ukuran “word” yang masing-masing sebanyak 4 bytes. Oleh karenanya, spasi ditambahkan untuk membuat alokasi memori menjadi sebuah kelipatan empat.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka standar masukan/keluaran.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi variabel tunggal bilangan bulat.

    int main()
    {
        int v__bilangan = 1234567890 ;
    }
  3. Selanjutnya, dalam blok fungsi main(), masukkan pernyataan-pernyataan untuk mengungkap alokasi memori tipe data int berdasarkan nama tipe dan objek.

    printf( "Ukuran tipe data int adalah %d bytes\n" , sizeof( int ) ) ;
    printf( "Ukuran variabel int adalah %d bytes\n" , sizeof( v__bilangan ) ) ;
  4. Sekarang masukkan sebuah pernyataan untuk mengungkap alokasi memori sebuah larik untuk masing-masing anggotanya.

    printf( "Ukuran sebuah larik int %d bytes\n" , sizeof( int[3] ) ) ;
  5. Definisikan sebuah struktur yang berisi sebuah variabel char dan int kemudian ungkap alokasi memori totalnya — termasuk spasinya.

    struct { int v__skor ; char v__peringkat } s__hasil ;
    printf( "Ukuran struktur adalah %d bytes\n" , sizeof( s__hasil ) ) ;
    
  6. Pada bagian akhir blok fungsi main() keluarkan sebuah bilangan bulat bernilai nol seperti yang disyaratkan oleh deklarasinya.

    return 0 ;
  7. Simpan berkas program, kemudian kompilasi dan eksekusi program untuk melihat keluaran operasi-operasi sizeof.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.6 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.6. Menghitung Alokasi Memori dalam Bahasa C.

4.7. Membandingkan Nilai-nilai Bit

Sebuah byte terdiri dari delapan bit dengan masing-masingnya berisi angka 1 atau 0 untuk menyimpan sebuah bilangan biner yang mewakili nilai desimal dari 0 sampai 255. Setiap bit menyumbang sebuah komponen desimal hanya saat bit tersebut mengandung angka 1. Komponen-komponen dirancang dari kanan ke kiri, dari “Least Significant Bit” (LSB) ke “Most Significant Bit” (MSB). Bilangan biner dalam pola bit di bawah mewakili 50 desimal.

No. Bit 8 MSB 7 6 5 4 3 2 1 LSB
Desimal 128 64 32 16 8 4 2 1
Biner 0 0 1 1 0 0 1 0

Walaupun tipe data char merupakan unit penyimpanan dasar 1-byte dalam pemrograman C, adalah mungkin untuk memanipulasi bagian-bagian individu sebuah byte menggunakan operator-operator “bitwise“.

Operator Nama Operasi Bilangan Biner
| OR Mengeluarkan sebuah angka 1 jika dua bit yang dibandingkan salah satunya bernilai 1.
Contoh: 1010 | 0101 = 1111
& AND Mengeluarkan sebuah angka 1 jika kedua bit yang dibandingkan bernilai 1.
Contoh: 1010 & 1100 = 1000
~ NOT Mengeluarkan sebuah angka 1 jika kedua bit yang dibandingkan tidak bernilai 1.
Contoh: 1010 ~ 0011 = 0100
^ XOR Mengeluarkan sebuah angka 1 jika kedua bit yang dibandingkan hanya satu yang bernilai 1.
Contoh: 1010 ^ 0100 = 1110
<< Geser kiri (shift left) Menggeser setiap bit yang bernilai 1 per sebuah bilangan tertentu ke kiri.
Contoh: 0010 << 2 = 1000
>> Geser kanan (shift right) Menggeser setiap bit yang bernilai 1 per sebuah bilangan tertentu ke kanan.
Contoh: 1000 >> 2 = 0010

Terkecuali pemrograman untuk sebuah perangkat dengan sumberdaya terbatas maka biasanya operator-operator bitwise akan jarang digunakan, namun mereka bisa sangat berguna. Misalnya, operator XOR (eXclusive OR) mengizinkan pemrogram untuk menukar nilai antar dua variabel tanpa membutuhkan variabel ketiga.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran yang standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasi dua variabel bilangan bulat, kemudian keluarkan nilai awal mereka.

    int main()
    {
        int v__x = 10 , v__y = 5 ;
        printf( "\nv__x=%d v__y=%d\n" , v__x , v_y ) ;
    }
  3. Selanjutnya dalam blok fungsi main(), masukkan sebuah pernyataan XOR tiga kali untuk menukar nilai variabel melalui manipulasi bit biner.

    v__x = v__x ^ v__y ; /* 1010 ^ 0101 = 1111 (15 desimal) */
    v__y = v__x ^ v__y ; /* 1111 ^ 0101 = 1010 (10 desimal) */
    v__x = v__x ^ v__y ; /* 1111 ^ 1010 = 0101 (5 desimal) */
  4. Sekarang masukkan sebuah pernyataan untuk mengeluarkan nilai-nilai yang dipertukarkan.

    printf( "\nv__x=%d v__y=%d\n" , v__x, v__y ) ;
  5. Pada akhir blok fungsi main() keluarkan sebuah bilangan bulat bernilai nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
  6. Simpanlah berkas program, kemudian kompilasi dan eksekusi program untuk melihat sihir bitwise XOR.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.7 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.7. Membandingkan Nilai-nilai Bit dalam Bahasa C.

4.8. Menandai Bit-bit

Sejauh ini, penggunaan operator-operator bitwise yang paling umum adalah untuk memanipulasi sebuah “medan bit” kompak yang mengandung sehimpunan “tanda” boolean. Hal tersebut dapat menggunakan memori lebih efisien dibandingkan menyimpan nilai-nilai tanda boolean dalam variabel yang berbeda — sebuah tipe data char yang terdiri dari hanya satu byte dapat menangani sebuah medan bit delapan tanda, satu per bit, sedangkan delapan variabel char yang terpisah membutuhkan seluruh memori bytes.

Tanda bit awal dapat dibangun dengan menyematkan sebuah nilai desimal ke variabel yang setara binernya memiliki sebuah angka 1 untuk setiap bit yang akan “dinyalakan” sebagai sebuah tanda boolean. Sebagai contoh, 8 desimal memiliki padanan biner 1000 (1×8 0×4 0×2 0×1) sehingga hanya “menyalakan” tanda keempat, dibaca dari kanan ke kiri dari bit signifikan terkecil.

Secara berurut, nilai tanda bit dapat dibalikkan menggunakan operator bitwise NOT ~ namun harus diperhatikan untuk menutupi angka nol sebelum menandai bit, alih-alih semuanya akan diubah sebagai angka 1. Sebagai contoh, untuk membalikkan sebuah medan bit empat tanda dalam empat digit terkanan sebuah byte maka empat bit terkini harus ditutupi. 15 desimal merupakan 00001111 (0×128 0×64 0×32 0×16 1×8 1×4 1×2 1×1) biner dan penutupan tersebut dapat diterapkan dengan dengan operator AND &.

Pola tanda bit dapat juga dimanipulasi dengan menggeser tanda-tanda tersebut yang dinyalakan oleh sebuah bilangan bit tertentu menggunakan operator bitwise Geser kiri (Shift left) << dan Geser kanan (Shift right) >>.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah variabel karakter yang diinisialisasi dengan sebuah nilai desimal yang menyalakan satu tanda bit.

    int main()
    {
        int v__tanda = 8 ; /* 1000 ( 1×8 0×4 0×2 0×1 ) biner */
    }
  3. Selanjutnya dalam blok fungsi main(), sematkan sebuah nilai baru pada variabel, juga untuk menyalakan tanda lainnya.

    v__tanda = v__tanda | 2 /* 1000 | 0010 = 1010 (10 desimal) */
  4. Sekarang masukkan pernyataan-pernyataan untuk mengeluarkan semua tanda bit yang ditata.

    printf( "Tanda 1: %s\n" , ( ( v__tanda & 1 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 2: %s\n" , ( ( v__tanda & 2 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 3: %s\n" , ( ( v__tanda & 4 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 4: %s\n\n" , ( ( v__tanda & 8 ) > 0 ) ? "NYALA" : "MATI" ;
  5. Selanjutnya, masukkan pernyataan untuk menutup empat bit pertama byte tersebut, kemudian tukar semua penataan tanda bit.

    char v__penutup = 15 ; /* 00001111 biner */
    v__tanda = ~v__tanda & v__penutup ; /* ~(1010 & 1111 = 1010) = 0101 */
  6. Sekarang masukkan pernyataan-pernyataan untuk mengeluarkan kebalikan tanda bit yang ditata dan nilai desimal yang mewakili pola berikut.

    printf( "Tanda 1: %s\n" , ( ( v__tanda & 1 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 2: %s\n" , ( ( v__tanda & 2 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 3: %s\n" , ( ( v__tanda & 4 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Tanda 4: %s\n\n" , ( ( v__tanda & 8 ) > 0 ) ? "NYALA" : "MATI" ;
    printf( "Nilai tanda desimal adalah %d\n" , v__tanda ) ;
  7. Tambahkan sebuah pernyataan untuk menggeser tanda bit satu bit “NYALA” ke kiri dengan mengeluarkan nilai desimal pola yang baru.

    v__tanda = v__tanda << 1 ; /* 0101 << 1 = 1010 */
    printf( "Nilai tanda desimal sekarang adalah %d\n" , v__tanda ) ;			
  8. Pada akhir blok fungsi main() keluarkan nilai bilangan bulat nol seperti yang disyaratkan pada deklarasi fungsi.

    return 0 ;
  9. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat manipulasi tanda bit.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.8 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.8. Menandai Bit-bit dalam Bahasa C.

4.9. Memahami Pengutamaan

Operator pengutamaan (precedence) menjelaskan urutan ketika bahasa C mengevaluasi ungkapan-ungkapan. Sebagai contoh, dalam ungkapan a = 6 + b * 3 maka urutan pengutamaan menentukan apakah penjumlahan atau perkalian yang diselesaikan terlebih dahulu.

Tabel di bawah ini memberi daftar operator pengutamaan dalam urutan yang menurun, dengan mana operator-operator pada baris yang lebih atas memiliki pengutamaan yang lebih daripada baris di bawahnya, jadi operasi-operasinya diselesaikan terlebih dahulu.

Operator-operator pada baris yang sama memiliki pengutamaan yang sama namun urutan penyelesaian ditentukan berdasarkan arah pengelompokannya (asosiatifitas). Sebagai contoh, untuk pengelompokan “Kiri ke kanan” (Left to right) maka operasi pada bagian kiri diselesaikan terlebih dahulu.

Operator: Pengelompokan:
() Pemanggil fungsi [] Indeks larik Kiri ke kanan
-> Struct pointer . Anggota struct
! NOT ~Bitwise NOT ++ Cacah naik Kanan ke kiri
-- Cacah turun + Tanda positif sizeof
- Tanda negatif * Pointer & Alamat dari
* Perkalian / Pembagian % Modulus Kiri ke kanan
+ Penambahan - Pengurangan Kiri ke kanan
<< Geser kiri >> Geser kanan Kiri ke kanan
< Lebih kecil dari <= Lebih kecil atau sama dengan dari Kiri ke kanan
> Lebih dari >= Lebih atau sama dengan dari
== Persamaan != Pertidaksamaan Kiri ke kanan
& Bitwise AND Kiri ke kanan
^ Bitwise XOR Kiri ke kanan
| Bitwise OR Kiri ke kanan
&& AND Kiri ke kanan
|| OR Kiri ke kanan
?: Kondisional Kanan ke kiri
= += -= *= /= %= &= ^= |= <<= >>= Operator-operator penyematan Kanan ke kiri
, Koma Kiri ke kanan

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>
  2. Tambahkan sebuah fungsi main() yang mengeluarkan sebuah bilangan bulat dari ungkapan yang mengikuti aturan pengutamaan tingkat-baris, dan yang lain secara eksplisit mengikuti pengutamaan yang sudah ditentukan.

    int main()
    {
        printf( "\nPengutamaan bawaan ((2 * 3) + 4) - 5 : %d\n" , 2 * 3 + 4 - 5 ) ;
        printf( "Pengutamaan eksplisit 2 * ((3 + 4) - 5) : %d\n" , 2 * ( (3 + 4) - 5) ) ;
    }
  3. Selanjutnya, dalam blok fungsi main(), keluarkan sebuah bilangan bulat dari aturan pengutamaan pengelompokan Kiri-ke-kanan berikut kemudian diikuti pengutamaan eksplisit lainnya yang sudah ditentukan.

    printf( "\nPengutamaan bawaan (7 * 3) %% 2 : %d\n" , 7 * 3 % 2 ) ;
    printf( "Pengutamaan eksplisit 7 * (3 %% 2) : %d\n" , 7 * (3 % 2) ) ;
  4. Sekarang keluarkan sebuah bilangan bulat untuk aturan pengutamaan pengelompokan Kanan-ke-kiri berikut kemudian pengutamaan eksplisit lainnya.

    int v__bilangan = 9 ;
    printf( "\nPengutamaan bawaan ( 8 / 2) * 4 : %d\n" , --v__bilangan / 2 * sizeof( int ) ;
    printf( "Pengutamaan eksplisit 8 / ( 2 * 4) : %d\n" , --v__bilangan / (2 * sizeof( int )) ) ;
  5. Pada akhir blok fungsi main() keluarkan sebuah bilangan bulat nol sesuai yang disyaratkan pada saat mendeklarasikan fungsi.

    return 0 ;
  6. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat keluaran aturan pengutamaan berikut.

Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 4.9 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):

Video 4.9. Memahami Pengutamaan dalam Bahasa C.

4.10. Ringkasan

  • Operator-operator aritmetis dapat membentuk ungkapan dengan melibatkan dua operand untuk penambahan +, pengurangan -, perkalian *, pembagian /, dan modulus %.
  • Operator penambah cacah ++ dan pengurang cacah -- memodifikasi operand tunggal dengan satu satuan nilai.
  • Operator penyematan = dapat dikombinasikan dengan sebuah operator aritmetis untuk melakukan sebuah perhitungan aritmetis kemudian menyematkan hasilnya.
  • Operator-operator perbandingan dapat membentuk ungkapan-ungkapan membandingkan dua operand untuk persamaan ==, pertidaksamaan !=, lebih besar >, lebih kecil <, lebih besar atau sama dengan >=, dan lebih kecil atau sama dengan <=.
  • Operator logika AND && dan OR || membentuk ungkapan untuk mengevaluasi dua operand kemudian memberikan keluaran sebuah nilai boolean yang bernilai benar atau salah, namun operator logika NOT ! mengeluarkan kebalikan nilai boolean untuk operand tunggal.
  • Operator kondisional ?: mengevaluasi sebuah ungkapan boolean yang diberikan kemudian memberikan keluaran satu dari dua operand bergantung pada hasilnya.
  • Operator sizeof memberikan keluaran ukuran byte memori sebuah tipe data atau sebuah objek data.
  • Byte memori tunggal terdiri atas delapan bit yang masing-masing mengandung sebuah nilai satu (1) atau nol (0).
  • Operator-operator bitwise OR |, AND &, NOT ~, dan XOR ^ masing-masing memberikan keluaran sebuah nilai setelah melakukan perbandingan nilai dua bit, sedangkan operator Geser kiri (Shift left) << dan Geser kanan (Shift right) >> memindahkan nilai-nilai bit berdasarkan sebuah bilangan tertentu sesuai nama arahnya.
  • Penggunaan operator-operaot bitwise yang paling umum adalah untuk memanipulasi sebuah medan bit kompak yang mengandung sehimpunan tanda boolean.
  • Ungkapan-ungkapan yang berisikan beberapa operator akan mengeksekusi operasi mereka berdasarkan aturan pengutamaan bawaan terkecuali ditentukan secara eksplisit dengan menambahkan tanda kurung.

1) Operand adalah objek sebuah operasi matematika atau dengan kata lain merupakan suatu variabel (data) yang dikenai operasi matematika (perkalian, pengurangan, dsb.).

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.