Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Operator shift kiri dan shift kanan:
Operator shift bitwise adalah operator shift kanan (>>
), yang memindahkan bit ekspresi tipe bilangan bulat atau enumerasi ke kanan, dan operator shift kiri (<<
), yang memindahkan bit ke kiri. 1
Sintaks
shift-expression
:
additive-expression
shift-expression
<<
additive-expression
shift-expression
>>
additive-expression
Keterangan
Penting
Deskripsi dan contoh berikut valid di Windows untuk arsitektur x86 dan x64. Implementasi operator shift kiri dan shift kanan secara signifikan berbeda pada Windows untuk perangkat ARM. Untuk informasi selengkapnya, lihat bagian "Operator Shift" dari posting blog Hello ARM .
Shift Kiri
Operator shift kiri menyebabkan bit masuk digeser shift-expression
ke kiri dengan jumlah posisi yang ditentukan oleh additive-expression
. Posisi bit yang telah dikosokkan oleh operasi shift diisi nol. Shift kiri adalah pergeseran logis (bit yang digeser dari akhir dibuang, termasuk bit tanda). Untuk informasi selengkapnya tentang jenis pergeseran bitwise, lihat Pergeseran bitwise.
Contoh berikut menunjukkan operasi shift kiri menggunakan angka yang tidak ditandatangani. Contoh menunjukkan apa yang terjadi pada bit dengan mewakili nilai sebagai bitset. Untuk informasi selengkapnya, lihat Kelas bitset.
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned short short1 = 4;
bitset<16> bitset1{short1}; // the bitset representation of 4
cout << bitset1 << endl; // 0b00000000'00000100
unsigned short short2 = short1 << 1; // 4 left-shifted by 1 = 8
bitset<16> bitset2{short2};
cout << bitset2 << endl; // 0b00000000'00001000
unsigned short short3 = short1 << 2; // 4 left-shifted by 2 = 16
bitset<16> bitset3{short3};
cout << bitset3 << endl; // 0b00000000'00010000
}
Jika Anda menggeser kiri nomor yang ditandatangani sehingga bit tanda terpengaruh, hasilnya tidak ditentukan. Contoh berikut menunjukkan apa yang terjadi ketika 1 bit digeser kiri ke posisi bit tanda.
#include <iostream>
#include <bitset>
using namespace std;
int main() {
short short1 = 16384;
bitset<16> bitset1(short1);
cout << bitset1 << endl; // 0b01000000'00000000
short short3 = short1 << 1;
bitset<16> bitset3(short3); // 16384 left-shifted by 1 = -32768
cout << bitset3 << endl; // 0b10000000'00000000
short short4 = short1 << 14;
bitset<16> bitset4(short4); // 4 left-shifted by 14 = 0
cout << bitset4 << endl; // 0b00000000'00000000
}
Shift Kanan
Operator shift kanan menyebabkan pola bit masuk digeser shift-expression
ke kanan dengan jumlah posisi yang ditentukan oleh additive-expression
. Untuk angka yang tidak ditandatangani, posisi bit yang telah dikosokkan oleh operasi shift diisi nol. Untuk nomor yang ditandatangani, bit tanda digunakan untuk mengisi posisi bit kosong. Dengan kata lain, jika angka positif, 0 digunakan, dan jika angka negatif, 1 digunakan.
Penting
Hasil pergeseran kanan dari angka negatif yang ditandatangani bergantung pada implementasi. Meskipun pengkompilasi Microsoft C++ menggunakan bit tanda untuk mengisi posisi bit yang dikosongkan, tidak ada jaminan bahwa implementasi lain juga melakukannya.
Contoh ini menunjukkan operasi shift kanan menggunakan angka yang tidak ditandatangani:
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned short short11 = 1024;
bitset<16> bitset11{short11};
cout << bitset11 << endl; // 0b00000100'00000000
unsigned short short12 = short11 >> 1; // 512
bitset<16> bitset12{short12};
cout << bitset12 << endl; // 0b00000010'00000000
unsigned short short13 = short11 >> 10; // 1
bitset<16> bitset13{short13};
cout << bitset13 << endl; // 0b00000000'00000001
unsigned short short14 = short11 >> 11; // 0
bitset<16> bitset14{short14};
cout << bitset14 << endl; // 0b00000000'00000000
}
Contoh berikutnya menunjukkan operasi shift kanan dengan angka yang ditandatangani positif.
#include <iostream>
#include <bitset>
using namespace std;
int main() {
short short1 = 1024;
bitset<16> bitset1(short1);
cout << bitset1 << endl; // 0b00000100'00000000
short short2 = short1 >> 1; // 512
bitset<16> bitset2(short2);
cout << bitset2 << endl; // 0b00000010'00000000
short short3 = short1 >> 11; // 0
bitset<16> bitset3(short3);
cout << bitset3 << endl; // 0b00000000'00000000
}
Contoh berikutnya menunjukkan operasi shift kanan dengan bilangan bulat bertanda tangan negatif.
#include <iostream>
#include <bitset>
using namespace std;
int main() {
short neg1 = -16;
bitset<16> bn1(neg1);
cout << bn1 << endl; // 0b11111111'11110000
short neg2 = neg1 >> 1; // -8
bitset<16> bn2(neg2);
cout << bn2 << endl; // 0b11111111'11111000
short neg3 = neg1 >> 2; // -4
bitset<16> bn3(neg3);
cout << bn3 << endl; // 0b11111111'11111100
short neg4 = neg1 >> 4; // -1
bitset<16> bn4(neg4);
cout << bn4 << endl; // 0b11111111'11111111
short neg5 = neg1 >> 5; // -1
bitset<16> bn5(neg5);
cout << bn5 << endl; // 0b11111111'11111111
}
Shift dan promosi
Ekspresi di kedua sisi operator shift harus berupa jenis integral. Promosi integral dilakukan sesuai dengan aturan yang dijelaskan dalam Konversi Standar. Jenis hasilnya sama dengan jenis yang dipromosikan shift-expression
.
Dalam contoh berikut, variabel jenis char
dipromosikan ke int
.
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
char char1 = 'a';
auto promoted1 = char1 << 1; // 194
cout << typeid(promoted1).name() << endl; // int
auto promoted2 = char1 << 10; // 99328
cout << typeid(promoted2).name() << endl; // int
}
Detail
Hasil operasi shift tidak terdefinisi jika additive-expression
negatif atau jika additive-expression
lebih besar dari atau sama dengan jumlah bit dalam (dipromosikan) shift-expression
. Tidak ada operasi shift yang terjadi jika additive-expression
adalah 0.
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned int int1 = 4;
bitset<32> b1{int1};
cout << b1 << endl; // 0b00000000'00000000'00000000'00000100
unsigned int int2 = int1 << -3; // C4293: '<<' : shift count negative or too big, undefined behavior
unsigned int int3 = int1 >> -3; // C4293: '>>' : shift count negative or too big, undefined behavior
unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior
unsigned int int5 = int1 >> 32; // C4293: '>>' : shift count negative or too big, undefined behavior
unsigned int int6 = int1 << 0;
bitset<32> b6{int6};
cout << b6 << endl; // 0b00000000'00000000'00000000'00000100 (no change)
}
Catatan kaki
1 Berikut ini adalah deskripsi operator shift dalam spesifikasi ISO C++11 (INCITS/ISO/IEC 14882-2011[2012]), bagian 5.8.2 dan 5.8.3.
Nilai adalah E1 << E2
E1
posisi bit yang digeser E2
kiri; bit kosong diisi nol. Jika E1
memiliki jenis yang tidak ditandatangani, nilai hasilnya adalah E1 × 2E2, mengurangi modulo satu lebih dari nilai maksimum yang dapat diwakili dalam jenis hasil. Jika tidak, jika E1
memiliki jenis yang ditandatangani dan nilai non-negatif, dan E1 × 2E2 dapat diwakili dalam jenis hasil yang tidak ditandatangani yang sesuai, maka nilai tersebut, dikonversi ke jenis hasil, adalah nilai yang dihasilkan; jika tidak, perilaku tidak ditentukan.
Nilai adalah E1 >> E2
E1
posisi bit yang digeser E2
kanan. Jika E1
memiliki jenis yang tidak ditandatangani atau jika E1
memiliki jenis yang ditandatangani dan nilai non-negatif, nilai hasilnya adalah bagian integral dari kuota E1/2E2. Jika E1
memiliki jenis yang ditandatangani dan nilai negatif, nilai yang dihasilkan ditentukan implementasi.
Lihat juga
Ekspresi dengan operator biner
Operator, prioritas, dan associativitas bawaan C++