Anda di halaman 1dari 30

Percobaan II

Pointer, Structure, Array, Dan Operasi Dalam Level Bit

Sella Veralisa Simangunsong (14S18005)


Dosen:Indra Hartanto Tambunan, Ph.D (0128048403)
Asisten : Philippians Manurung, ST
Tanggal Percobaan : 09/10/2020
14S3102 – Praktikum Arsitektur Sistem Komputer
Institut Teknologi Del

Abstrak— tipe data merupakan data yang disimpan dalam mendefinisikan daftar variabel yang akan ditempatkan dalam
memory. Tipe data menetukan operasi yang dapat dilakukan pada blok memory menggunakan satu nama. Dengan demikian,
suatu data bertipe tertentu, rentang nilai yang mungki dimiliki setiap variabel berbeda pada structure dapat diakses
oleh data bertipe tertentu, arti dari data, dan cara menyimpan menggunakan sebuah single pointer atau dengan menggunakan
data tersebut dalam memory. Dalam Bahasa C mendukung
nama structure itu sendiri. Pada structure, masing-masing
pengolahan informasi dalam level bit menggunakan operator
bitwise. Berbeda dengan opertator level byte, operator bitwise variabel disimpan dalam blok memory yang kontigu yang
akan mengoperasikan data untuk setiap bit. Structure meruapakn biasanya memiliki delimiter berupa panjang word. Kita juga
complex data type yang mendefinisikan daftar variable yang akan dapat menggunakan sintaks sizeof untuk memeriksa ukuran
ditempatkan dalam blok memory menggunakan satu nama. structure yang definisikan.
Dengan demikian , setiap variable berbeda pada structure dapat Array merupakan kumpulan lokasi penyimpanan data yang
diakses menggunakan sebuah single pointer. Array merupakan kontigu (berurutan) dengan tipe data yang sama. Setiap lokasi
kumpulan lokasi penyimpanan data yang kontigu (berurutan) penyimpanan dalam sebuah array disebut elemen array. Array
dengan tipe data yang sama. Pointer merupakan variable; yng dialokasikan secara sekaligus dalam memory sesuai dengan
menyimpan alamat memory, dengan kata lain pointer memiliki
ukurannya. Karena letak elemen yang berurutan, akses elemen
nilai alamat memory untuk melaksanakan referensi terhadap
suatu objek yang tersimpan dalam memory computer. array pada memory relatif lebih mudah dan cepat dibandingkan
dengan struktur data Linked- List. Setiap elemen dalam array
Kata Kunci—level bit, memory, array, pointer, structure, bitwise, dapat diakses menggunakan indeks yang biasanya berupa
enkripsi, dekripsi,. bilangan bulat skalar bukan negatif.
Pointer merupakan variabel yang menyimpan alamat memory.
Dengan kata lain, pointer memiliki nilai alamat memory untuk
I. PENDAHULUAN melakukan referensi terhadap suatu objek yang tersimpan
dalam memory komputer. Dengan menggunakan pointer, kita
Tipe data merupakan representasi data yang disimpan dalam
dapat memiliki akses terhadap memory secara langsung. Untuk
memory. Tipe data menentukan operasi yang dapat dilakukan
setiap tipe data T, terdapat pointer ke T. Deklarasi pointer dalam
pada suatu data bertipe tertentu, rentang nilai yang mungkin
bahasa C dapat dilakukan dengan mudah, contohnya int *ptr
dimiliki oleh data bertipe tertentu, arti dari data, dan cara
yang merupakan pointer yang melakukan referensi terhadap
menyimpan data tersebut dalam memory. Terdapat beberapa
objek bertipe integer.
tipe data yang telah tersedia dalam bahasa C. Tipe data yang
tersedia ini disebut simple data type. Dengan adanya perbedaan
II. LANDASAN TEORETIS
ukuran masing-masing tipe data, diperlukan sebuah mekanisme
alignment pada memory agar setiap data tersusun dengan baik
di dalam memory dan dapat diproses oleh mikroprosesor. 2.1. POINTER
Dengan alignment, data-data variabel disimpan dalam lokasi Pointer merupakan variabel yang dapat memegang alamat dari
memory yang memiliki address offset yang berupa kelipatan suatu objek dalam memori. Pointer digunakan dalam program
dari ukuran word. Hal ini akan menambah performance karena untuk mengakses dan manipulasi data pada alamat tertentu.
data disusun sesuai cara mikroprosesor menggunakan memory. Dalam ANSI/C, array dan pointer memiliki keterkaitan yang
Bahasa C mendukung pengolahan informasi dalam level bit erat. Array dikenal sebagai pointer yang tetap (fixed pointer)
menggunakan operator bitwise. Berbeda dengan operator level sedangkan pointer sangat dinamis, artinya alamat yang
byte, operator bitwise akan mengoperasikan data untuk setiap dipegang oleh sebuah pointer dapat berubah-ubah. Jika dalam
bit. Sedangkan operator level byte, data akan diolah dalam materi fungsi dikenal mekanisme pengiriman suatu parameter
bentuk 1 byte (1 byte = 8 bit). Operator bitwise dapat digunakan via alamat atau (called-by reference), dalam ANSI/C,
pada berbagai tipe data seperti char, int, short, long, atau pengiriman parameter seperti itu dapat dilakukan menggunakan
unsigned. Structure (struct) merupakan complex data type yang pointer. Pointer adalah sebuah variabel dengan tipe tertentu
yang dapat digunakan untuk mencatat alamat dari suatu
variabel yang setipe dengannya, mengakses dan memanipulasi 2.2. TIPE DATA
data yang tersimpan dalam alamat tersebut. Jika int x adalah Tipe data merupakan representasi data yang disimpan dalam
sebuah variable bertipe integer maka &x berarti alamat dari x. memory. Tipe data menentukan operasi yang dapat dilakukan
Jika p adalah sebuah pointer bertipe integer maka p dapat pada suatu data bertipe tertentu, rentang nilai yang mungkin
menyimpan dan memegang alamat dari x tersebut. dimiliki oleh data bertipe tertentu, arti dari data, dan cara
Dalam ANSI/C, simbol asterisk * digunakan untuk menyimpan data tersebut dalam memory. Terdapat beberapa
mendeklarasi sebuah pointer. Bentuk umum pendeklarasian tipe data yang telah tersedia dalam bahasa C. Tipe data yang
pointer adalah: tipe_data *nama_pointer; tersedia ini disebut simple data type. C menggunakan 7
Sebagai contoh: int *p; keyword untuk menset tipe, yaitu :
Simbol asterik * memberitahu compiler bahwa sebuah pointer - integer : bilangan bulat (int, long, short, unsigned)
bertipe int dideklarasikan. Pendeklarasian seperti contoh di atas - huruf & karakter lain (char)
hanya memberitahukan compiler bahwa p adalah pointer - bilangan dg titik desimal (float, double)
bertipe int tanpa memberikan nilai awal apapun kepada p. Jika Tipe - tipe yang dihasilkan oleh keyword tersebut dibagi
sebuah pointer tidak diberi nilai awal secara eksplisit oleh menjadi 2 kelompok berdasarkan cara mereka disimpan
programmer, maka compiler secara otomatis memberi nilai komputer : 5 keyword pertama menghasilkan tipe integer
NULL sebagai nilai awal kepada pointer tersebut. Salah satu 2 keyword terakhir menghasilkan tipe floating-point.
cara menguji apakah sebuah pointer bernilai NULL adalah: 1. Integer , adalah bilangan bulat tanpa bagian fraksional
dan titik decimal integer disimpan sebagai bilangan
if(p == NULL) biner . Bilangan tanpa titik desimal dan eksponen
{ dikenali oleh kompilator sbg integer Contoh : 22 dan
Perhatikan pernyataan di bawah ini: -273 adalah konstan integer 22.0 bukan konstan
int i = 2; int *pi = &i; integer 22E3 bukan konstan integer.
Pernyataan di atas dapat divisualisasi sebagai berikut: 2. Short Dalam TURBO C variabel short dan variabel
integer tidak dibedakan
3. Long Variabel ini digunakkan untuk menaikkan
kapasitas dari variabel ybs
4. Tipe unsigned Variabel ini digunakan jika ingin
bekerja dengan data yang bernilai positif saja
Atau dengan kata lain, sebuah variabel i bertipe int dengan nilai Contoh : Unsigned int students; Unsigned players;
awal 2 dideklarasikan dan sebuah pointer pi bertipe int Unsigned short ribs = 6.
dideklarasikan dengan nilai awal dari pointer pi tersebut adalah 5. Tipe Char Mendefinisikan integer tak bertanda dalam
alamat dari variabel i. range 0 - 255 Disimpan dalam 1 byte Sebagian besar
Pernyataan: menggunakan kode ASCII Contoh : huruf A dalam
int *pi = &i; ASCII konversinya adalah 65 (desimal)
Berarti mendeklarasi sebuah pointer pi bertipe int dengan nilai Masing-masing tipe data memiliki ukuran yang berbeda-beda
awal berupa alamat dari i yang bertipe int. Simbol & pada untuk disimpan di dalam memory. Dalam bahasa C, kita dapat
pernyataan di atas merupakan operator unari yang bermakna menggunakan sintaks sizeof untuk mengetahui besar tipe data
alamat (address). Pointer juga dapat digunakan untuk tersebut di dalam memory. Contohnya, untuk mengetahui
menunjukkan structure berdasarkan alamatnya di memory. Hal ukuran tipe data integer, kita cukup menggunakan perintah
ini sangat berguna untuk melakukan passing structure ke atau sizeof(int) untuk mengetahui ukurannya. Kita juga dapat
dari sebuah fungsi hanya dengan memberikan alamat structure melihat rentang nilai yang direpresentasikan oleh masing-
tersebut di memory. Pointer ini juga dapat di-dereferensi seperti masing tipe data.
halnya pointer lain dalam bahasa C, yaitu menggunakan
operator dereference (*). Selain itu, juga terdapat operator yang
sangat berguna yaitu struct_name -> member untuk melakukan
dereferensi pointer-to-struct lalu mengakses nilai dari anggota
structure tersebut. Operator tersebut memiliki ekuivalensi
dengan (*struct_name).member. Sebetulnya, sebuah fungsi
dapat langsung mengembalikan sebuah structure walaupun hal
ini terkadang tidak efisien saat dijalankan. Dalam array, indeks
biasanya didefinisikan sebagai perhitungan matematika
terhadap alamat pointer. Dengan demikian penulisan array[i]
memiliki ekuivalensi dengan *(array + i). Perhitungan
matematika terhadap pointer untuk mengakses setiap elemen
array dapat dilakukan karena array memiliki elemen yang
tersusun secara kontigu (berurutan tanpa jeda).
Dengan adanya perbedaan ukuran masing-masing tipe data,
diperlukan sebuah mekanisme alignment pada memory agar
setiap data tersusun dengan baik di dalam memory dan dapat menghasilkan nilai salah. Berikut ini tabel yang menunjukkan
diproses oleh mikroprosesor. Dengan alignment, data-data hasil dari operasi XOR. Tabel kebenaran XOR
variabel disimpan dalam lokasi memory yang memiliki address
offset yang berupa kelipatan dari ukuran word. Hal ini akan
menambah performance karena data disusun sesuai cara
mikroprosesor menggunakan memory.

2.3. Operator Bitwise


Operator bitwise digunakan untuk menyelesaikan operasi-
operasi bilangan dalam bentuk biner yang dilakukan bit demi Operator Shift-Right (">>")
bit. Dengan kata lain, operator bitwise ini berfungsi untuk Operator shift-right (geser kanan) ini digunakan untuk
melakukan pemanipulasian bit. Operasi ini merupakan hal vital melakukan penggeseran bit ke arah kanan sebanyak nilai yang
apabila program yang kita buat kan melakukan interaksi dengan didefinisikan. Apabila terdapat operasi X >> 3 berarti
perangkat keras (hardware). Meskipun bahasa pemrograman melakukan penggeseran 3 bit ke kanan dari nilai X yang telah
lebih bersifat data-oriented, namun perangkat keras masihlah dikonversi ke dalam bilangan biner. Adapun bentuk umum dari
bersifat bit-oriented. Ini artinya, perangkat keras menginginkan penggunaan operator >> adalah sebagai berikut.
input dan output data yang dilakukan terhadapnya tetap dalam Untuk memudahkan Anda dalam menentukan hasil yang
bentuk bit tersendiri. diberikan dari operasi ini, ingatlah bahwa setiap proses
Perlu ditekankan di sini bahwa operasi pemanipulasian bit ini pergeseran bit yang terjadi, operator >> akan membagi suatu
hanya dapat dilakukan pada bilangan-bilangan yang bertipe nilai dengan 2. Sedangkan 1 << 2 akan memberikan hasil 4
char dan int saja karena keduanya dapat berkoresponden (berasal dari 1 x 2 x 2), 1 << 3 memberikan hasil 8 (berasal
dengan tipe byte dan word di dalam bit. Adapun yang termasuk dari 1 x 2 x 2 x 2), begitu seterusnya.
ke dalam operator bitwise di dalam bahasa C adalah seperti
yang tertera dalam tabel di bawah ini. Operasi Shift-Left ("<<")
Operator shift-left (geser kiri) merupakan kebalikan dari
operator >>, artinya di sini kita melakukan pergeseran bit ke
arah kiri sebanyak nilai yang didefinisikan. Berikut ini bentuk
umum penggunaan operator <<.
Dalam setiap pergeseran bit-nya, operator ini akan mengalikan
suatu nilai dengan 2. Misalnya 1 << 1, maka hasil yang akan
didapatkan adalah 2 (berasal dari 1 x 2).
Bahasa C juga memiliki operator logika AND, inclusive OR,
dan NOT. Operator ini sering tertukar dengan operator bitwise.
Fungsi dari operator &, | dan ~ di atas sebenarnya sama dengan Operator logika tersebut diberikan sebagai berikut. Pada
fungsi operator logika &&, || dan !. Perbedaannya hanya operasi logika, setiap argumen bukan nol merepresentasikan
operator bitwise ini melakukan operasinya bit demi bit, TRUE, sedangkan argumen nol merepresentasikan FALSE.
sedangkan operator logika melakukan operasi pada nilai Ekspresi logika akan mengembalikan nilai 1 untuk TRUE dan
totalnya. Sebagai contoh apabila kita melakukan operasi logika nilai 0 untuk FALSE.
7 || 8, maka hasil yang akan didapatkan adalah 1, pasalnya nilai
7 dan 8 akan dianggap sebagai nilai benar (true) sehingga
operasi OR tersebut juga akan menghasilkan nilai true yang
direpresentasikan dengan nilai 1. Namun, jika kita melakukan
operasi bitwise 7 | 8, maka nilai 7 dan 8 tersebut akan dikonversi
ke dalam bilangan biner, setelah itu baru dilakukan operasi OR
untuk setiap bit-nya. 2.4. Structure
0 0 0 0 1 0 0 0 nilai 8 dalam bentuk biner Structure (struct) merupakan complex data type yang
0 0 0 0 0 1 1 1 nilai 7 dalam bentuk biner mendefinisikan daftar variabel yang akan ditempatkan dalam
----------------- | blok memory menggunakan satu nama. Dengan demikian,
0 0 0 0 1 1 1 1 hasil = 15 setiap variabel berbeda pada structure dapat diakses
Cara kerja dari operator & dan ~ juga sama seperti di atas. menggunakan sebuah single pointer atau dengan menggunakan
Untuk itu di sini kita tidak akan membahas lebih detil tentang nama structure itu sendiri. Pada structure, masing-masing
kedua operator tersebut. Adapun operator lain yang perlu Anda variabel disimpan dalam blok memory yang kontigu yang
ketahui di sini adalah operator ^ (bitwise XOR), >> (shift right) biasanya memiliki delimiter berupa panjang word. Kita juga
dan << (shift left). dapat menggunakan sintaks sizeof untuk memeriksa ukuran
Operator XOR structure yang kita definisikan. Perlu diingat bahwa bahasa C
Operasi XOR (exlusive OR) akan memberikan nilai benar tidak mengizinkan kita melakukan deklarasi rekursif terhadap
apabila hanya terdapat satu buah operand yang bernilai benar, structure (sebuah structure tidak boleh berisi structure bertipe
selain itu akan menghasilkan nilai salah. Dengan demikian, yang sama dengan structure tersebut). Kita dapat menggunakan
apabila kedua operand-nya bernilai benar, operasi ini tetap akan pointer untuk melakukannya. Beberapa mesin juga
membutuhkan alignment data pada memory secara spesifik
sehingga ukuran structure dapat berbeda karena compiler secara dengan dua dimensi. Array tersebut memiliki elemen array
otomatis melakukan alignment data-data pada structure, berupa array, contohnya int pusheen[][5] atau int
contohnya dengan padding. pusheen[4][5]. Namun, karena memory komputer bersifat
2.5. Array linear, komputer akan menyimpan array n-dimensi dalam
Array adalah sekumpulan elemen bertype sama, yang bentuk linear juga. Hal ini menyebabkan kita harus
mempunyai sebuah nama (nama array) dan setiap elemen dapat memperhatikan urutan indeks untuk mengakses setiap elemen
diacu melalui indeksnya. Array dengan satu indek disebut array array n-dimensi karena hal ini akan berpengaruh terhadap
berdimensi sat, vector, larik, atua tabel. Array dengan dua performance dari program yang kita buat terlebih data array
indeks disebut array dua dimensi atau matriks array dapat yang diolah cukup besar, contohnya seberapa baikkah program
mempunyai dimensi lebih dari dua. Yang harus diperhatikan yang kita buat dalam memanfaatkan cache memory (cache-
adalah: friendly)
- Nama array (seluruh elemen) dalam Bahasa C nama
array mengacu ke elemen yang ke-0
- Dimensi array (banyaknya indeks)
- Ukuran array , atau batas nilai indeks, dalam Bahasa C
batas minimum nilai indeks adalah 0
Array dapat didefinisikan secara static atau secara dinamik.
Array static adalah array yang ukurannya ditentukan saat
kompilasi. Sedangkan array dinamik adalah array yang
ukurannya didefinisikan pada saat run time dengan perintah
alokasi memori.
Array merupakan kumpulan lokasi penyimpanan data yang
kontigu (berurutan) dengan tipe data yang sama. Setiap lokasi
penyimpanan dalam sebuah array disebut elemen array. Array
dialokasikan secara sekaligus dalam memory sesuai dengan
ukurannya. Karena letak elemen yang berurutan, akses elemen
array pada memory relatif lebih mudah dan cepat dibandingkan
dengan struktur data Linked- List. Setiap elemen dalam array
dapat diakses menggunakan indeks yang biasanya berupa
bilangan bulat skalar bukan negatif. Dalam bahasa C, elemen
pertama dalam array diberi indeks 0. Representasi array dalam
memory dengan deklarasi int nim[8] adalah sebagai berikut
(asumsikan address elemen ke-0 adalah 0x4000 dengan nilai
elemen pertama adalah 1, nilai elemen kedua adalah 3, nilai
elemen ketiga adalah 2, nilai elemen keempat adalah 1, nilai
elemen kelima adalah 1, nilai elemen keenam adalah 0, nilai
elemen ketujuh adalah 0, dan nilai elemen kedelapan adalah 7).

Bahasa C mendukung deklarasi array secara statis maupun


secara dinamis. Array statis memiliki ukuran yang tidak bisa
diubah-ubah sedangkan array dinamis memiliki ukuran yang
dapat ditentukan saat program sedang berjalan. Array dinamis
dapat dideklarasikan dengan contoh int pusheen[]. Dengan
demikian pusheen merupakan array yang memiliki elemen
bertipe integer namun dengan banyak elemen yang belum
didefinisikan. Untuk melakukan alokasi terhadap array
pusheen, kita dapat menggunakan perintah malloc atau calloc
dalam bahasa C. Untuk mengubah ukuran array dinamis yang
telah dialokasikan, kita dapat menggunakan perintah realloc.
Untuk melakukan dealokasi array dinamis, kita dapat
menggunakan perintah free. Perhatikan bahwa pada beberapa
kasus, perintah realloc dapat menyebabkan program tidak
efisien contohnya saat array diubah ukurannya menjadi lebih
besar dan sistem harus melakukan pemindahan elemen-elemen
array ke posisi memory yang baru agar perbesaran ukuran array
dapat dilakukan. Array juga dapat memiliki elemen array
berupa array. Dengan demikian, kita dapat mendefinisikan
array n-dimensi. Contohnya, sebuah matriks merupakan array
III. HASIL DAN ANALISIS
a. Tugas 1: Fungsi XOR
Operasi XOR (exlusive OR) akan memberikan nilai benar apabila hanya terdapat satu buah operand yang bernilai benar, selain itu akan menghasilkan nilai salah.
Dengan demikian, apabila kedua operand-nya bernilai benar, operasi ini tetap akan menghasilkan nilai salah. Pada kode program ini digunakan operator XOR dengn
menggunakan header file. Berikut adalah file header dari kode program. Pada header file tersebut digunakan tipe integer.
Code program XOR_function.h
int bitXor (int x, int y);

Setelah header file dibuat maka, body harus juga dibuat agar dapat dikompilasi. Berikut adalah kode program dari body of header file. Pada program dibawah ini
diguakan operator NOT dan AND. Pada output nantinya computer akan mengeksekusi hasil yaitu NOT x AND y.
Code program XOR_function.c
#include <stdio.h>

int bitXor(int x, int y)


{
int hasil;
hasil = ((~x) & y);
return hasil;
}

Berikut adalah kode program utama dari XOR. Dimana angka yang diigunakan adalah 4 XOR 5. Setelah angka diubah menjadi bilangan biner maka setiap bit akan
dieksekusi. Operator bitwise digunakan untuk menyelesaikan operasi-operasi bilangan dalam bentuk biner yang dilakukan bit demi bit. Dengan kata lain, operator
bitwise ini berfungsi untuk melakukan pemanipulasian bit. Operasi ini merupakan hal vital apabila program yang kita buat kan melakukan interaksi dengan perangkat
keras (hardware). Meskipun bahasa pemrograman lebih bersifat data-oriented, namun perangkat keras masihlah bersifat bit-oriented. Ini artinya, perangkat keras
menginginkan input dan output data yang dilakukan terhadapnya tetap dalam bentuk bit tersendiri.

Dari tabel kebenaran diatas jika kita bandingkan dengankode yang ada pada body, maka hasilnya akan bernilai 1.
Code program main_XOR_function.c
#include<stdio.h>
#include "XOR_function.h"
#include "XOR_function.c"

int main(int argc, char *argv[])


{
int a=4;
int b=5;
int result;
result = bitXor(a,b);
printf("Hasil dari a^b : %d", result);
return 0;
}

Maka didapat output dari kode program adalah sebagai berikut:


Dan didapat hasilnya adalah 1.
Output program

b. Tugas 2 : Fungsi Ekstraksi Byte


Kode Program getByte.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :getByte.h
//deskripsi :fungsi ekstraksi Byte

int getByte (int x, int n);


Kode program diatas merupakan header file ekstraksi Byte. Dimana byte akan di ekstrak menjadi byte yang lebih kecil. Pada kode tersebut digunakan tipe data
integer. Berikut adalah kode program getByte.c yang merupakan body dari header. Pada kode akan dipanggil int getByte(int x, int n) yang terdapat
pada header. Pada kode digunakan kode.
Kode program getByte.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :getByte.c
//deskripsi :fungsi ekstraksi Byte

#include <stdio.h>
#include "getByte.h"

int getByte(int x, int n)


{
switch (n){
case 0: return ((unsigned) (x & 0x000000FF)) >> 0;
case 1: return ((unsigned) (x & 0x0000FF00)) >> 8;
case 2: return ((unsigned) (x & 0x000FF0000)) >> 16;
case 3: return ((unsigned) (x & 0xFF000000)) >> 24;
}
}

Kode program diatas merupakan body dari header file. Pada kode program digunakan switch case
switch (n){
case 0: return ((unsigned) (x & 0x000000FF)) >> 0;
case 1: return ((unsigned) (x & 0x0000FF00)) >> 8;
case 2: return ((unsigned) (x & 0x000FF0000)) >> 16;
case 3: return ((unsigned) (x & 0xFF000000)) >> 24;
karena bit tidak hanya dalam satu tipe namun dan juga berbeda ukuran byte maka dilakukan case dengan byte 0, 8, 16, dan 24 byte. Setiap case akan dieksekusi
computer sesuai nilai bit yang kita input. Berikut adalah main code dari ekstraksi byte
Kode program main_getByte.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :main_getByte.c
//deskripsi :fungsi ekstraksi Byte
#include <stdio.h>
#include "getByte.h"
#include "getByte.c"

int main (void)


{
int x;
int result;
int n;
printf("masukkan data yang akan di Ekstraksi :");
scanf("%x", &x);
printf("Ekstraksi pada data ke - :");
scanf("%d", &n);
printf("result : 0x%x", getByte(x,n));
return 0;
}
Setelah dideklarasikan pada kode body maka pada main kode ini akan dilakukan pemanggilan fungsi dari header file dan body. Maka didapat output program adalah
sebagai berikut.
Output Program:

Dari output diatas dapat kita lihat jika kita menginput data 0x12345678 pada data ke 1 maka didapat hasil ekstraksi byte nya adalah 0x56 .
0x000000FF
0x0000FF00
0x000FF0000
0xFF000000
Berdasarkan fungsi diatas maka ekstraksi byte berhasul dilkukan dengan menggunakan shift artinya byte digeser kekiri sesuai tipe yang diatas. Maka ekstraksi file
berhasil dilakukan oleh computer.

c. Tugas 3: Fungsi Masking Byte


Pada kode ini dilakukan masking byte yang dimulai dari batas bawah dan batas atas . fungsi yang dapat menghasilkan suatu mask dengan aturan seluruh bit di antara
batas atas (highbit) dan batas bawah (lowbit) diset menjadi 1 sedangkan bit di luar batas atas (highbit) dan batas bawah (lowbit) diset menjadi 0. Asumsi yang
digunakan adalah 0 ≤ batas bawah ≤ 31 dan 0 ≤ batas atas ≤ 31. Selain itu, bila batas bawah > batas atas maka masking yang dihasilkan adalah 0x0000000
Maka kode yang dapat dibuat agar masking byte diperoleh adalah sebagai berikut.
Kode program bitmask.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :bitMask.h
//deskripsi :fungsi masking Byte

int bitMask (int highbit, int lowbit);

Kode program diatas merupakan kode header file dari masiking byte dimana menggunakan fungsi yang bertipe integer.
int bitMask (int highbit, int lowbit);
berikut adalah kode body dari header file.
Kode program bitmask.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :bitMask.c
//deskripsi :fungsi masking Byte

#include <stdio.h>
#include "bitMask.h"

int bitMask (int highbit, int lowbit)


{
int range = highbit-lowbit;
unsigned masking;
if (range < 1){
return 0;
}
else{
masking = (1 << 31 ) >> range;
return masking >> (31-highbit);
}
}
Pada kode program diatas digunakan if else karena ditentukan batas yaitu antara 1-31 sehingga if-else digunakan dalam program ini . pada program ii terdapat
pemnggilan fungsi int bitMask (int highbit, int lowbit)
Berikut adalah kode program main bitmask.
Kode program main_bitMask.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :main_bitMask.c
//deskripsi :fungsi masking Byte

#include <stdio.h>
#include "bitMask.h"
#include "bitMask.c"

int main (void)


{
int x, y;
printf("Masukkan bats atas :");
scanf("%d", &x);
printf("Masukkan batas bawah :");
scanf("%d", &y);
printf("hasil Masking : 0x%x", bitMask(x,y));
}

Berikut adalah output dari kode program


Output kode program

Pada output dapat kita lihat, batas atas yang diinput adalah 5 dan batas bawah adalah 3 hasil yang diperoleh 0x38. 0x38 merupakan hasil masking dari kode
program
masking = (1 << 31 ) >> range;
return masking >> (31-highbit);
dari fungsi tersebut proses masking dapat kita peroleh yaitu dengan shift ke kiri sebanyak 31 dan shift kekanan sebanyak jumlah batas nya . batas yang
dinput adalah 5 dan 3 maka diperoleh 0x38.
d. Tugas 4: Fungsi Membalik Urutan
Pada kode program ini diperintahkan untuk membuat fungsi membalik urutan, seprti urutan byte. Jika user menginput 0x321 maka output nya adalah 0x123. Artinya
byte dibalik urutannya. fungsi yang dapat membalik urutan byte dari suatu data X dengan menukar byte ke-0 dengan byte ke-3 dan byte ke-2 dengan byte ke-1.
Urutan byte pada data berurutan dari byte ke-0 pada LSB dan byte ke-3 pada MSB. Berikut adalah kode program header filenya.
Kode program reverseByte.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :reverseByte.h
//deskripsi :fungsi memabalik urutan Byte

int reverseByte (int x);

Kode program reverseByte.c


//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :reverseByte.c
//deskripsi :fungsi memabalik urutan Byte

#include <stdio.h>
#include "reverseByte.h"

int reverseByte (int x)


{
int result =0;
int i;
for (i=0; i<=3; i++){
result += ((x >> 8 * i) & 0xFF) << 8 * (3-i);
}
return result;
}

Dari kode program diatas dapat kita lihat fungsi yang digunakan
for (i=0; i<=3; i++){
result += ((x >> 8 * i) & 0xFF) << 8 * (3-i);
berdasrakan fungsi tersebut maka byte yang kita input dapat dibalik urutannya
Kode program main_reverseByte.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :bitMask.c
//deskripsi :fungsi memabalik urutan Byte

#include <stdio.h>
#include "reverseByte.h"
#include "reverseByte.c"

int main (void)


{
int y;
int hasil;
printf ("Masukkan data yang akan dibalik :");
scanf("%x", &y);
printf("Hasil reverse Byte: 0x%x", reverseByte(y));
return 0;
}
Kode program diatas merupakan main kode dari reverseByte, maka diperoleh output adalah sebagai berikut
Output program

Mengapa diperoleh hasil eksekusi demikian? Cara kerjanya adalah sebagai berikut:
Sesuai kode program yang kita buat, dilakukan pemisahan Byte dengan operator yang kita gunakan yaitu operator AND. Operator AND kan melakukan
penukaran posisi dengan byte 0xFF sesuai kode. Kita menginput byte 0x01020304 maka operator akan melakukan penukaran posisi. Angka 4 yang
sebelumnya diakhir setelah direverse posis berubah didepan diikuti dengan angka 0, namun sehingga urutan menjadi 40302010, maka reverse berhasil
dilakukan.
e. Tugas 5: Fungsi Pengurangan Byte
Pada program ini dilakukan pengurangan byte. fungsi yang dapat menghitung hasil pengurangan antara byte data pertama dikurangi byte data kedua. Sistem bilangan
negatif yang digunakan adalah sistem two’s complement. Operator pengurangan (-) tidak boleh digunakan dalam merealisasikan fungsi pengurangan byte ini. Namun
Hanya operator penjumlahan (+) dan invers (~) saja yang dapat digunakan untuk merealisasikan fungsi. Maka berikut adalah kode program dengan mengguanakan
header file. Fungsi yang digunakan adalah int minBytes (int x, int y);
Kode program minBytes.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :minBytes.h
//deskripsi :fungsi penguragan Byte

int minBytes (int x, int y);

Kode program minBytes.c


//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :minBytes.c
//deskripsi :fungsi penguragan Byte

#include <stdio.h>
#include "minBytes.h"

int minBytes (int x, int y)


{
y = ~y+1;
x= x + y;
x + x&0x000000FF;
return x;
}
Kode program diatas merupakan body of header
y = ~y+1;
x= x + y;
x + x&0x000000FF;
return x;
dengan fungsi diatas dapat dilakukan pengurangan bit . y sama dengan not y +1 dan x sama dengan x ditambah y. maka untuk kode main adalah sebagai berikut.
Kode program main_minBytes.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :main_minBytes.c
//deskripsi :fungsi penguragan Byte

#include <stdio.h>
#include "minBytes.h"
#include "minBytes.c"

int main (){


int result;
int a, b;
result = minBytes (0x15, 0x07);
printf("Masukkan bilangan pertama:");
scanf("%x", &a);
printf(" \n Masukkan bilangan kedua: ");
scanf("%x", &b);
printf("\n Hasil pengurangan Byte :0x0%x", result);
}

Dengan main kode diats maka output yang diperoleh adalah sebagai berikut
Output program
Pada output user menginput nilai bilangan pertama 0x15 dan bilangan kedua 0x07. Kedua bilanagn byte dikurangkan dan memperoleh hasil 0x0e. mengapa
bisa terjadi demikian? Karena digunakan algoritma pengurangan yang terdapat pada body. Karena dideklarasikan
y = ~y+1;
x= x + y;
x + x&0x000000FF;
dimana y merupakan bilangan kedua, y dinotasikan dalam operator not. Artinya komputer akan mengubah nyte menjadi note dan kemudian dijumlahkan
dengan byte y. kemudian x dideklarasikan dengan x tambah y yang artinya byte x dijumlah dengan byte y yang dinotasikan sebelumnya. Operator yang
dilakukan adalah AND dan hasil penguarangan 0xFF.

f. Tugas 6: Fungsi Shift Register


Dalam kode diperintahkan untuk melakukan shift. sebuah fungsi yang merepresentasikan sebuah shift register pada rangkaian sistem digital. Asumsikan bahwa
jumlah bit sebanyak 32 bit dan setiap nilai yang dimasukkan ke dalam shift register secara bergantian adalah 5 bit. Nilai awal shift register harus 0x00000000. Perlu
diperhatikan bahwa pada shift register, input yang sebelumnya diberikan akan berpengaruh terhadap state shift register untuk input yang baru. Maka kode program
yang digunakan adalah sebagai berikut: dengan fungsi int shifRegister (int x);
Kode program shifRegister.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :shifRegister.h
//deskripsi :fungsi shif register

int shifRegister (int x);


Operator shift-right (geser kanan) ini digunakan untuk melakukan penggeseran bit ke arah kanan sebanyak nilai yang didefinisikan. Apabila terdapat operasi X >>
3 berarti melakukan penggeseran 3 bit ke kanan dari nilai X yang telah dikonversi ke dalam bilangan biner. Untuk memudahkan kita dalam menentukan hasil yang
diberikan dari operasi ini, ingatlah bahwa setiap proses pergeseran bit yang terjadi, operator >> akan membagi suatu nilai dengan 2. Operator shift-left (geser kiri)
merupakan kebalikan dari operator >>, artinya di sini kita melakukan pergeseran bit ke arah kiri sebanyak nilai yang didefinisikan. Berikut ini bentuk umum
penggunaan operator <<.
Kode program shifRegister.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :shifRegister.c
//deskripsi :fungsi shif register

#include <stdio.h>
#include "shifRegister.h"

int global_var =0;


int shifRegister (int x)
{
global_var = (global_var << 5) + x;
return global_var;
}

Dalam kode program diatas digunakan


int global_var =0;
int shifRegister (int x)
{
global_var = (global_var << 5) + x;
return global_var;
agar proses shift register dapat dilakukan computer. Dalam setiap pergeseran bit-nya, operator ini akan mengalikan suatu nilai dengan 2. Misalnya 1 << 1, maka
hasil yang akan didapatkan adalah 2 (berasal dari 1 x 2). Sedangkan 1 << 2 akan memberikan hasil 4 (berasal dari 1 x 2 x 2), 1 << 3 memberikan hasil 8
(berasal dari 1 x 2 x 2 x 2), begitu seterusnya.
Kode program main_shifRegister.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :main_shifRegister.c
//deskripsi :fungsi shif register

#include <stdio.h>
#include "shifRegister.h"
#include "shifRegister.c"

int main (void)


{
printf ("Global var 1 :0x%.8x\n", shifRegister(0x04));
printf ("Global var 2 :0x%.8x\n", shifRegister(0x13));
return 0;
}
Dengan menggunakan kode program diatas maka kita memperoleh output sebagai berikut
Output program

pada output diperolah global var 1 sama dengan 0x00000004 dan global Var 2sama dengan 0x00000093. Mengapa diperoleh demikian? Pada fungsi shift
register dilakukan pergeseran bit kearah kanan.
printf ("Global var 1 :0x%.8x\n", shifRegister(0x04));
printf ("Global var 2 :0x%.8x\n", shifRegister(0x13));
return 0;
dari kutipan kode tersebut dapat kita lihat bahwa dilakukan operasi shift. Diberi input 0x13 dan 0x04. Byte tersebut digeser kekanan sebanyak 6 kali dengan
menambah 0 dibelakang 04 demikian juga pada 0x13 digeser kekanan dan ditambah bit 0. Sehingga diperoleh seperti pada gambar output diatas.

g. Tugas 9: Fungsi Membalik urutan Array


Pada kode ini diperintahkan untuk membalik urutan array. program yang dapat menerima beberapa karakter yang diberikan oleh pengguna, menyimpan karakter-
karakter tersebut pada sebuah array of character, lalu menampilkannya di layar dengan susunan yang terbalik. Contoh hasil eksekusi adalah sebagai berikut. Pengguna
memberikan input karakter satu per satu sehingga membentuk susunan HELLO. Kemudian program akan menampilkannya di layar dengan susunan OLLEH.
Kode program pembailk_urutan_array
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :pembalik_urutan_array.c
//deskripsi :fungsi membalik urutan array

#include <stdio.h>
#include <string.h>
int main ()
{
char teks[100];
int i, length;
printf("Masukkan satu kata :");
gets (teks);
length=strlen(teks);
printf("karakter yang sudah dibalik: ");
for (i=length-1;i>=0;i--){
printf ("%c", teks[i]);
}
printf("\npanjang kata = %d", length);
return 0;
}
Dengan kode program yang ditas maka output yang diperoleh adalah sebagai berikut
Output kode program
pada output komputer meminta inputan dengan masukkan kata. Contoh, user memasukkan kata sella maka kata tersebut dibalik menjadi alles. Komputer juga
dapat menghitung jumlah kata yang diinput. Mengapa terjadi demikian? Karena kode yang digunakan
gets (teks);
length=strlen(teks);
printf("karakter yang sudah dibalik: ");
for (i=length-1;i>=0;i--){
printf ("%c", teks[i]);
kode tersebut memerintahkan untuk menghitung jumlah kata dan membalikkan urutan kata tersebut. Kita menggunakan looping dan juga array dengan looping
I, untuk i panjang dikurang satu, I lebih besar atau sama dengan nol dan I minus, maka setiap kata yang diinptu dibalik urutan sehingga diperoleh alles.

h. Tugas 10: Matriks Nama


Pada kode diperintahkan untuk membuat matriks nama. sebuah program yang dapat menerima input yang diberikan berupa nama orang yang dimasukkan karakter
per karakter kemudian menyimpan data nama orang tersebut dalam array of nama_orang. Dengan mengingat bahwa nama_orang adalah array of character, maka
program tersebut harus dapat merealisasikan array of array of character. Program ini kemudian juga dapat menampilkan isi dari array of array of character pada layar
sesuai dengan urutan yang benar. Maka kode program adalah sebagai berikut:
Kode program matriks_nama.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :matriks_nama.c
//deskripsi :matriks nama

#include <stdio.h>
int main()
{
int jlh_mhs, n;
char nama[100][100];
printf(“Jumlah mahasiswa :”);
scanf(“%d”, &n);

for (jlh_mhs=0; jlh_mhs < n; jlh_mhs ++){


printf(“Nama mahasiswa ke-%d :”, jlh_mhs + 1);
scanf(“%s”, &nama[jlh_mhs]);
}
for (jlh_mhs=0; jlh_mhs < n; jlh_mhs++){
printf(“%s”, nama[jlh_mhs]);
printf(“\n”);
}
return 0;
}
Output kode program

Pada outpur dapat kita lihat bahwa nama yang diinput akan berbentuk matrisk. Megapa hal tersebut terjadi? Karena kode yang digunakan adalah

for (jlh_mhs=0; jlh_mhs < n; jlh_mhs ++){


printf(“Nama mahasiswa ke-%d :”, jlh_mhs + 1);
scanf(“%s”, &nama[jlh_mhs]);
}
for (jlh_mhs=0; jlh_mhs < n; jlh_mhs++){
printf(“%s”, nama[jlh_mhs]);
printf(“\n”);
dari potongan kode jelas terlihat adanya looping , user bebas menginput data berapa aja, karena sudah dideklarasikan pada kode, nama yang diinput akan membentuk
sebuah matriks . jlh_mhs adalah array dan menyimpan data yang diinput kedalam array. Kemudian data tersebut dideklarasikan dalam bentuk matriks sehingga
menghasilkan result matriks berdimensii dua printf(“%s”, nama[jlh_mhs]); dari kode tersebut maka computer dapat mengeksekusi inputan user.

i. Tugas 11: Matriks Nama Pointer


Pada kode program ini diperintahkan untuk matriks nama dengan pointer. realisasi array of array of character diganti dengan array of pointer to array of character.
Program ini kemudian juga dapat menampilkan isi dari array of pointer to array of character pada layar sesuai dengan urutan yang benar. Bandingkan hasil
implementasi pada tugas 10 dengan tugas 11 terutama dari segi efisiensi penggunaan memory dan pengaksesan memory. Maka kode program adalah sebagai berikut.
Kode program Matriks_nama_pointer.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :matriks_nama_pointer.c
//deskripsi :matriks nama dengan pointer

#define MAX 10
#define SIZE 31
#include <stdio.h>

int main ()
{
char *nama[MAX], input [MAX][SIZE];
int x, y, a;

printf ("Masukkan nama kata per kata (maksimal 10 enter) :\n");

for (a=0; a<MAX; a++){


gets(input[a]);
nama [a] = input[a];
if (!strcmp (nama[a], "exit")){
break;
}
}
printf("\nOUTPUT\n");
for (x =0; x<a; x++){
printf ("%s", nama[x]);
}
return 0;
}
Dengan kode program yang diatas maka output yang diperoleh adalah sebagai berikut.
Output kode program
Pada output dapat kita lihat bahwa karakter yang kita masukkan satu persatu maka akan mengahsilkan sebuah kata. Inputan minimal sepuluh karakter. Contoh, user
menginput kata s e l l a v e r a l sehingga menjadi sebuah kata sellaveral. Mengapa hel tersebut dapat terjadi?
Karena pada pointer dapat menunjukkan kepada pointer atau pointer to pointer. Pointer memungkinkan alokasi dinamik memori baru di alokasi berdasarkan kontrol
pemrograman, yaitu jika diperlukan. Jika tidak dibutuhkan lahi memori yang dialokasi dapat dealokasi ke mesin. Maka kode prgram yang digunakan adalah:
for (a=0; a<MAX; a++){
gets(input[a]);
nama [a] = input[a];
if (!strcmp (nama[a], "exit")){
break;
dengan kode ini maka komputer dapat mengerti perintah dana apa yang akan dilakukan. Diperintahkan untuk a ( a adalah inputan nama) sama dengan nol, a lebih
besar dari MAX , a ++. Maka komputer akan mengeksekusi atau mengurutkan nama dengan menyimpannya dalam array.
printf("\nOUTPUT\n");
for (x =0; x<a; x++){
printf ("%s", nama[x]);
maka dengan printf output maka kata yang dinput menjadi sebuah kata.

j. Tugas 13: Penjumlahan Biner Dengan Array


Pada kode ini diperintahkan untuk penjumlahan biner array. program yang dapat melakukan simulasi operasi penjumlahan dan pengurangan pada level bit dengan
representasi two’s complement menggunakan array. Array yang digunakan terdiri atas 8 bit saja dan hanya boleh diisi oleh angka 1 atau 0. Buatlah makefile untuk
melakukan kompilasi program ini. Bila diperlukan, Anda dapat menggunakan fungsi pada printbitbyte.c. Contohnya adalah sebagai berikut. Misalkan ada
penjumlahan antara 7 dan 8. Angka 7 akan dimasukkan ke dalam array berurutan untuk setiap bit menjadi 00000111 dan angka 8 akan dimasukkan ke dalam array
berurutan untuk setiap bit menjadi 00001111. Kemudian hasil penjumlahannya adalah 00001111. Hasil penjumlahan ini kemudian diubah menjadi bilangan desimal
dengan membaca isi array tersebut. Maka kode program yang diperolah adalah sebagai berikut.
Kode program sum_biner.h
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :sum_biner.h
//deskripsi :penjumlahan biner dengan array

#ifndef START_VAL
#define START_VAL 0

void penjumlahanBiner (int bil1, int bil2);

#endif
Kode program sum_biner.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :sum_biner.c
//deskripsi :penjumlahan biner dengan array

#include <stdio.h>
#include <math.h>
#include “sum_biner.h”

int fungsiXOR (int x, int y)


{
int hasil;
hasil = ~(~(~x & y) & (~(x & ~y)));
return hasil;
#ifndef START_VAL
#define START_VAL

void penjumlahanBiner (int bil1, int bil2);


#endif
}

int getbit (int x, int n){


return ((x>>n) & 1);
}
int bitdes (int *a)
{
23ecim;
int value;
for (i =0; i<=6; i++){
value += a[i]*pow(2,i);
}
value -= a[7]*pow(2,7);

return value;
}
Kode program main_sum_biner.c
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :2
//Percobaaan :pointer, structure, array, dan operasi dalam level bit
//tanggal :09 oktober 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//Nama file :main_sum_biner.c
//deskripsi :penjumlahan biner dengan array
#include <stdio.h>
#include <math.h>
#include “sum_biner.h”
#include “sum_biner.c”
int main (void)
{
int x, y, i;
int temp, plus, min;
int C[8], D[8], E[8], result[8];
int carry=0;

printf(“Masukkan bilangan pertama :”);


scanf(“%d”, &x);
printf(“Masukkan bilangan kedua :”);
scanf(“%d”, &y);

for (i=0; i<8; i++){


C[i] =getbit (x,i);
D[i]=getbit (y,i);

}
for (i-0; i<8; i++){
result[i]= fungsiXOR (fungsiXOR(C[i], D[i]), carry);
carry =((C[i]&carry)|(D[i]&carry))|(C[i]&D[i]);
}
printf(“Hasil penjumlahan biner :”);

for (i=0; i<8; i++){


printf(“%d”, result[i]);
}
plus=bitdes(result);
printf(“\n Hasil 24ecimal : %d”, plus);
y = ~y + 1;

for (i=0; i<8; i++){

E[i]=getbit (y,i);
}

for (i=0; i<8; i++){


result[i]=fungsiXOR(fungsiXOR(C[i],E[i]),carry);
carry =((C[i]&carry)|(E[i]&carry))|(C[i]&E[i]);

}
printf (“\nHasil pengurangan biner :”);
for (i=0; i<8; i++){
printf(“%d”, result[i]);
}
min =bitdes(result);
printf(“\nHasil 25ecimal : %d”, min);

return 0;
}
Dengan kode program diatas maka output yang diperoleh adalah sebagai berikut:
Output kode program

Mengapa output dapat terjadi demikian?


int getbit (int x, int n){
return ((x>>n) & 1);
}
int bitdes (int *a)
{
25ecim;
int value;
for (i =0; i<=6; i++){
value += a[i]*pow(2,i);
}
value -= a[7]*pow(2,7);

return value;
dengan kode program diatas komputer dapat mengetahui perintah dan apa yang aka dilakukan yaitu melakukan penjumlahan bilangan biner.
for (i=0; i<8; i++){
C[i] =getbit (x,i);
D[i]=getbit (y,i);

Dengan looping computer dapat memahami bagaimana biner akan dijumlahkan sesuai permintaan user
for (i-0; i<8; i++){
result[i]= fungsiXOR (fungsiXOR(C[i], D[i]), carry);
carry =((C[i]&carry)|(D[i]&carry))|(C[i]&D[i]);
fungsi XOR yang digunakan adalah untuk dapat menjumlahkan bilangan bit
printf(“Hasil penjumlahan biner :”);

for (i=0; i<8; i++){


printf(“%d”, result[i]);
}
plus=bitdes(result);
printf(“\n Hasil 26ecimal : %d”, plus);
y = ~y + 1;
maka setelah bit diubah fungsi XOR maka memulai perintah penjumlahan atau pengurangan
for (i=0; i<8; i++){

E[i]=getbit (y,i);

for (i=0; i<8; i++){


result[i]=fungsiXOR(fungsiXOR(C[i],E[i]),carry);
carry =((C[i]&carry)|(E[i]&carry))|(C[i]&E[i]);
setelah biner dijumlahkan maka akan disimpan kedalam array dan lnjut prose yang selanjutnya
}
printf (“\nHasil pengurangan biner :”);
for (i=0; i<8; i++){
printf(“%d”, result[i]);
}
min =bitdes(result);
printf(“\nHasil 26ecimal : %d”, min);

return 0;
setelah seluruh proses selesai, misalnya user meminta data 2 maka setelaha proses kedua aka di tampilkan hasilnya pada layar. Dam memperoleh penjumalahan
bilangan biner.
Analaisis pertanyaan :
1. Bagaimana representasi tipe data float dan double dalam memory?
Jawab: Bilangan floating-point dapat merepresentasikan nilai yang rangenya jauh lebih besar daripada integer, Untuk operasi aritmetika, bil. floating-point bisa
kehilangan presisinya, Operasi terhadap bilangan floating-point lebih lambat daripada terhadap integer dan double tipe data floating point ukuran 64 bit

2. Bagaimana cara melakukan penulisan structure agar memory yang digunakan lebih efisien?
Jawab: Perlu diingat bahwa bahasa C tidak mengizinkan kita melakukan deklarasi rekursif terhadap structure (sebuah structure tidak boleh berisi structure bertipe
yang sama dengan structure tersebut). Kita dapat menggunakan pointer untuk melakukannya agar memory lebih efisien

3. Apa saja perbedaan structure dengan array?


Jawab: Structure (struct) merupakan complex data type yang mendefinisikan daftar variabel yang akan ditempatkan dalam blok memory menggunakan satu nama
sedangkan array adalah sekumpulan elemen yang bertype sama yang mempunyai sebuah nama dan setiap elemen dapat diacu melalui indeksnya.

4. Apa perbedaan array dinamis dan array statis?


Jawab:
Array dinamis adalah dideklarasikan dengan hanya menyebutkan pointer ke elemen yang k enol, dinamik dengan pointer
Array statis adalah memiliki ukuran yang tidak dapat diubah

5. Bagaimana cara mengakses elemen dari array?


Jawab: cara pengaksesan array adalah dengan deklarasi atau pendefinisian nama, alokasi menentukan ukuran , alokasi memori, inisialisasi nilai dan dealokasi atau
pengembalian memori. Dapat juga diakses menggunakan indeks

6. Bagaimana n-dimensional array direpresentasikan dalam memory?


Jawab: array n dimensional merupakan array dua dimensi yang terdiri dari dua buah subscript yaitu baris dan kolom. Array direpresentasikan adalam array dengan
baris dan kolom tersebut setiap baris dan kolom adalah array yang menyimpan memory

7. Apa saja operasi-operasi yang dapat dilakukan pada operasi level bit dalam bahasa C?
Jawab: Bahasa C mendukung pengolahan informasi dalam level bit menggunakan operator bitwise. Berbeda dengan operator level byte, operator bitwise akan
mengoperasikan data untuk setiap bit. Sedangkan operator level byte, data akan diolah dalam bentuk 1 byte (1 byte = 8 bit). Operator bitwise dapat digunakan pada
berbagai tipe data seperti char, int, short, long, atau unsigned

8. Bagaimana prinsip pengurangan pada sistem bilangan two’s complement?


Jawab: operasi pengurangan dilakukan dengan cara menjumlahkan bilngan pertama dengan nilai negative dari bilangan kedua

9. Apa saja yang dapat dilakukan oleh pointer? Mengapa penggunaan pointer dapat berbahaya apabila tidak digunakan sesuai alokasi alamatnya?
Jawab: Pointer dapat digunakan untuk menunjukkan structure berdasarkan alamatnya di memory. Hal ini sangat berguna untuk melakukan passing structure ke atau
dari sebuah fungsi hanya dengan memberikan alamat structure tersebut di memory. pointer memiliki nilai alamat memory untuk melakukan referensi terhadap suatu
objek yang tersimpan dalam memory komputer. Dengan menggunakan pointer, kita dapat memiliki akses terhadap memory secara langsung. Untuk setiap tipe data
T, terdapat pointer ke T.

10. Apa perbedaan pointer to char, pointer to integer, pointer to double dari segi bahasa assembly?
Jawab: pointer to char menunjuk kode C yang bertipe char, pointer to integer menunjuk kode C yang bertipe integer, pointer to double menunjuk kode C tipe double.

11. Apa perbedaan pointer to char, pointer to integer, pointer to double dari segi perhitungan address?
Jawab: dari segi address perbedaan yang dapat dilihat adalah bentuk pemanggilan alamat, pada pointer cara digunakan &c, pada pointer int digunakan &d, pada
double menunjuk alamat tipe double saja dan nilai pun akan berbeda.

12. Apa perbedaan implementasi array of pointer to array of character dengan array of character of character?
Jawab: Array juga dapat memiliki elemen array berupa array. Dengan demikian, kita dapat mendefinisikan array n-dimensi. Contohnya, sebuah matriks merupakan
array dengan dua dimensi. Array tersebut memiliki elemen array berupa array, contohnya int pusheen[][5] atau int pusheen[4][5]. Namun, karena memory komputer
bersifat linear, komputer akan menyimpan array n-dimensi dalam bentuk linear juga. Hal ini menyebabkan kita harus memperhatikan urutan indeks untuk mengakses
setiap elemen array n-dimensi karena hal ini akan berpengaruh terhadap performance dari program yang kita buat terlebih data array yang diolah cukup besar,
contohnya seberapa baikkah program yang kita buat dalam memanfaatkan cache memory (cache-friendly). Pointer
menggunakan sintaks sizeof untuk memeriksa ukuran
structure yang kita definisikan.
IV. SIMPULAN
Dari percobaan yang telah saya lakukan saya dapat
menyimpulkan bahwa: V. REFERENSI
1. Informasi level bit disimpan dalam memory dengan 1. Aho, A.V., Ravi, S., & Ullman, J.D. (2007).
representasi sesuai tipe datanya. Dengan adanya Compiler: Principle, techniques and tools. @nd.
perbedaan ukuran masing-masing tipe data, Addison-Wesley. New York
diperlukan sebuah mekanisme alignment pada 2. Bryant, Randal, dan David O’Hallaron. Computer
memory agar setiap data tersusun dengan baik di Systems : A Programmer’s Perspective 2nd Edition.
dalam memory dan dapat diproses oleh mikroprosesor. 2011. Massachusetts : Pearson Education Inc.
Dengan alignment, data-data variabel disimpan dalam 3. Patterson, David, dan John Hennessy. Computer
lokasi memory yang memiliki address offset yang Organization and Design : The Hardware/Software
berupa kelipatan dari ukuran word. Hal ini akan Interface. 2012. Waltham : Elsevier Inc.
menambah performance karena data disusun sesuai 4. Modul paraktikum arsitektur computer.
cara mikroprosesor menggunakan memory.
2. Bahasa C mendukung pengolahan informasi dalam
level bit menggunakan operator bitwise. Berbeda
dengan operator level byte, operator bitwise akan
mengoperasikan data untuk setiap bit. Sedangkan
operator level byte, data akan diolah dalam bentuk 1
byte (1 byte = 8 bit). Operator bitwise dapat digunakan
pada berbagai tipe data seperti char, int, short, long,
atau unsigned. Bahasa C juga memiliki operator logika
AND, inclusive OR, dan NOT. Operator ini sering
tertukar dengan operator bitwise.
3. Pointer juga dapat digunakan untuk menunjukkan
structure berdasarkan alamatnya di memory. Hal ini
sangat berguna untuk melakukan passing structure ke
atau dari sebuah fungsi hanya dengan memberikan
alamat structure tersebut di memory. Pointer ini juga
dapat di-dereferensi seperti halnya pointer lain dalam
bahasa C, yaitu menggunakan operator dereference
(*). Selain itu, juga terdapat operator yang sangat
berguna yaitu struct_name -> member untuk
melakukan dereferensi pointer-to-struct lalu
mengakses nilai dari anggota structure tersebut.
Operator tersebut memiliki ekuivalensi dengan
(*struct_name).member.
4. Array merupakan kumpulan lokasi penyimpanan data
yang kontigu (berurutan) dengan tipe data yang sama.
Setiap lokasi penyimpanan dalam sebuah array disebut
elemen array. Array dialokasikan secara sekaligus
dalam memory sesuai dengan ukurannya. Karena letak
elemen yang berurutan, akses elemen array pada
memory relatif lebih mudah dan cepat dibandingkan
dengan struktur data Linked- List. Setiap elemen
dalam array dapat diakses menggunakan indeks yang
biasanya berupa bilangan bulat skalar bukan negatif.
5. Structure (struct) merupakan complex data type yang
mendefinisikan daftar variabel yang akan ditempatkan
dalam blok memory menggunakan satu nama. Dengan
demikian, setiap variabel berbeda pada structure dapat
diakses menggunakan sebuah single pointer atau
dengan menggunakan nama structure itu sendiri. Pada
structure, masing-masing variabel disimpan dalam
blok memory yang kontigu yang biasanya memiliki
delimiter berupa panjang word. Kita juga dapat
Lampiran
Output dari kode program tugas 1

Output dari kode program tugas 3

Output dari kode program tugas 2

Output dari kode program tugas 5

Output dari kode program tugas 6

Output dari kode program tugas 9

Output dari kode program tugas 10

Anda mungkin juga menyukai