C的设计者认为旋转的处理应该适可而止
C的设计者的目标是建立最小的语言,自己可以建立旋转命令
//: C03:Rotation.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Perform left and right rotations
unsigned char rol(unsigned char val) {
int highbit;
if(val & 0x80) // 0x80 is the high bit only
highbit = 1;
else
highbit = 0;
// Left shift (bottom bit becomes 0):
val <<= 1;
// Rotate the high bit onto the bottom:
val |= highbit;
return val;
}
unsigned char ror(unsigned char val) {
int lowbit;
if(val & 1) // Check the low bit
lowbit = 1;
else
lowbit = 0;
val >>= 1; // Right shift by one position
// Rotate the low bit onto the top:
val |= (lowbit << 7);
return val;
} ///:~
//: C03:printBinary.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Display a byte in binary
void printBinary(const unsigned char val);
///:~
//: C03:printBinary.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include <iostream>
void printBinary(const unsigned char val) {
for(int i = 7; i >= 0; i--)
if(val & (1 << i))
std::cout << "1";
else
std::cout << "0";
} ///:~
//: C03:Bitwise.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
//{L} printBinary
// Demonstration of bit manipulation
#include "printBinary.h"
#include <iostream>
using namespace std;
// A macro to save typing:
#define PR(STR, EXPR) \
cout << STR; printBinary(EXPR); cout << endl;
int main() {
unsigned char rol(unsigned char val);
unsigned char ror(unsigned char val);
unsigned int getval;
unsigned char a, b;
cout << "Enter a number between 0 and 255: ";
cin >> getval; a = getval;
PR("a in binary: ", a);
cout << "Enter a number between 0 and 255: ";
cin >> getval; b = getval;
PR("b in binary: ", b);
PR("a | b = ", a | b);
PR("a & b = ", a & b);
PR("a ^ b = ", a ^ b);
PR("~a = ", ~a);
PR("~b = ", ~b);
PR("rol(a) = ", rol(a));
PR("rol(b) = ", rol(b));
PR("ror(a) = ", ror(a));
PR("ror(b) = ", ror(b));
// An interesting bit pattern:
unsigned char c = 0x5A;
PR("c in binary: ", c);
a |= c;
PR("a |= c; a = ", a);
b &= c;
PR("b &= c; b = ", b);
b ^= a;
PR("b ^= a; b = ", b);
fflush(stdin);
getchar();
} ///:~
使用在函数前要在Bitwise.cpp 中看到rol()和ror()的定义,至少是声明
位函数的效率非常高,因为直接被翻译成汇编语句
单独的C或C++语句产生一行单独的汇编代码
输出
Enter a number between 0 and 255: 25
a in binary: 00011001
Enter a number between 0 and 255: 36
b in binary: 00100100
a | b = 00111101
a & b = 00000000
a ^ b = 00111101
~a = 11100110
~b = 11011011
rol(a) = 00110010
rol(b) = 01001000
ror(a) = 10001100
ror(b) = 00010010
c in binary: 01011010
a |= c; a = 01011011
b &= c; b = 00000000
b ^= a; b = 01011011