Mengutip kode untuk menghitung nilai absolut integer (abs) tanpa bercabang dari http://graphics.stanford.edu/~seander/bithacks.html :
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
Variasi yang dipatenkan:
r = (v ^ mask) - mask;
Apa CHAR_BIT
dan bagaimana menggunakannya?
c
bit-manipulation
dato datuashvili
sumber
sumber
CHAR_BIT
?" , meskipun itu bukan pertanyaan aslinya. :( Dengan penjelasan Anda, saya mengerti mengapa Anda menulis jawaban ini, tetapi untuk anak cucu mungkin lebih berguna untuk (a) menghapus jawaban Anda dan menulis ulang sebagai komentar untuk pertanyaan, sehingga @ AraK muncul di atas, atau (b) edit jawaban Anda sehingga menjawab judul pertanyaan saat ini.CHAR_BIT
adalah jumlah bitchar
. Saat ini, hampir semua arsitektur menggunakan 8 bit per byte, tetapi tidak selalu demikian. Beberapa mesin lama dulunya memiliki byte 7-bit.Itu dapat ditemukan di
<limits.h>
.sumber
CHAR_BIT>=8
dan memungkinkan nilai yang jauh lebih besar untuk DSP yang hanya memiliki satu ukuran tipe, seringkali 32bit. POSIX membutuhkanCHAR_BIT==8
. Secara umum, Anda dapat mengasumsikan arsitektur multi-pengguna / multitasking berorientasi server atau berorientasi penggunaan interaktif dengan kemungkinan terhubung ke internet atau bertukar data tekstual dengan dunia luarCHAR_BIT==8
.int8_t
danuint8_t
ada. Dengan demikian terdapat jenis lebar 8. Sejaksizeof
jenis harus kompatibel dengansizeof char
benar-benarsizeof int8_t
harus 1. JadiCHAR_BIT == 8
. Saya telah menulis sesuatu tentang obesitas itu di sini: gustedt.wordpress.com/2010/06/01/how-many-bits-has-a-bytestdint.h
. Jadi itu diperlukan, dan itu juga ditandai sebagai Ekstensi untuk standar ISO C , tanpa mengacu pada versi tertentu dari standar itu. Salahku.Mencoba menjawab pertanyaan eksplisit (apa itu CHAR_BIT) dan pertanyaan implisit (bagaimana cara kerjanya) di pertanyaan asli.
Sebuah karakter dalam C dan C ++ mewakili unit memori terkecil yang dapat ditangani oleh program C *
CHAR_BIT di C dan C ++ mewakili jumlah bit dalam karakter. Harus selalu minimal 8 karena persyaratan lain pada tipe karakter. Dalam prakteknya pada semua komputer tujuan umum modern tepat 8 tetapi beberapa sistem historis atau spesialis mungkin memiliki nilai yang lebih tinggi.
Java tidak memiliki kesetaraan CHAR_BIT atau sizeof, tidak perlu karena semua tipe primitif di Java memiliki ukuran tetap dan struktur internal objek tidak jelas bagi pemrogram. Jika menerjemahkan kode ini ke Java, Anda cukup mengganti "sizeof (int) * CHAR_BIT - 1" dengan nilai tetap 31.
Dalam kode khusus ini digunakan untuk menghitung jumlah bit dalam sebuah int. Ketahuilah bahwa perhitungan ini mengasumsikan bahwa tipe int tidak berisi bit padding apa pun.
Asumsikan bahwa compiler Anda memilih untuk memperpanjang pada pergeseran bit dari bilangan bertanda tangan dan mengasumsikan sistem Anda menggunakan representasi komplemen 2s untuk angka negatif, ini berarti bahwa "MASK" akan menjadi 0 untuk nilai positif atau nol dan -1 untuk nilai negatif.
Untuk meniadakan bilangan komplemen dua, kita perlu melakukan bitwise not dan kemudian menambahkan satu. Secara seimbang kita dapat mengurangi satu dan kemudian meniadakannya dengan bitwise.
Sekali lagi dengan asumsi representasi pelengkap dua -1 diwakili oleh semua orang, jadi eksklusif atau dengan -1 setara dengan negasi bitwise.
Jadi ketika v adalah nol jumlahnya dibiarkan sendiri, ketika v adalah satu dinegasikan.
Sesuatu yang harus diperhatikan adalah bahwa luapan bertanda di C dan C ++ merupakan perilaku yang tidak ditentukan. Jadi menggunakan implementasi ABS ini pada nilai paling negatif menyebabkan perilaku tidak terdefinisi. Ini dapat diperbaiki dengan menambahkan cast sedemikian rupa sehingga baris terakhir program dievaluasi dalam unsigned int.
* Yang biasanya sama dengan unit memori terkecil yang dapat ditangani oleh perangkat keras. Implementasi berpotensi menggabungkan beberapa unit memori yang dapat dialamatkan perangkat keras ke dalam satu unit memori yang dapat dialamatkan program atau membagi satu unit memori yang dapat dialamatkan perangkat keras menjadi beberapa unit memori yang dapat ditambahkan program.
sumber