Coba jelasin /* dari Geseran melingkar dong

* Operasi geseran dalam C hanya didefinisikan untuk jumlah geseran

* yang nonnegatif dan lebih kecil daripada sizeof(nilai) * CHAR_BIT.

* Maskernya, yang dipakai dalam operasi AND (&), mencegah perilaku

* tak terdefinisi ketika jumlah geseran 0 atau lebih besar daripada

#include <stdint.h>  // untuk uint32_t, untuk memakai rotasi 32 bit tanpa memandang ukuran int

#include <limits.h>  // untuk CHAR_BIT

uint32_t rotl32(uint32_t nilai, unsigned int jumlah) {

const unsigned int masker = CHAR_BIT * sizeof(nilai) - 1;

return (nilai << jumlah) | (nilai >> (-jumlah & masker));

uint32_t rotr32(uint32_t nilai, unsigned int jumlah) {

const unsigned int masker = CHAR_BIT * sizeof(nilai) - 1;

return (nilai >> jumlah) | (nilai << (-jumlah & masker));

Implementasi yang aman dan ramah kompilator di atas dikembangkan oleh John Regehr dan dirapikan lebih lanjut oleh Peter Cordes.

Bentuk yang lebih sederhana biasa ditemui ketika jumlah dibatasi dari 1 sampai 31 bit.

uint32_t rotl32(uint32_t nilai, unsigned int jumlah) {

return nilai << jumlah | nilai >> (32 - jumlah);

Bentuk tersebut cukup berbahaya karena ia akan menggeser sebanyak 32 bit bila jumlah bernilai 0 atau 32 yang tidak didefinisikan dalam bahasa C. Namun, hal ini biasanya tetap bisa dipakai karena kebanyakan mikroprosesor menafsirkan nilai >> 32 sebagai geseran 32 bit (menghasilkan nol) atau tanpa pergeseran dan keduanya menghasilkan nilai yang tepat untuk penggunaan ini.

Untuk C++, penggunaan templat dapat memperluas dukungan untuk semua jenis bilangan bulat.