巧みにシフト演算
適切なシフト演算は、コードを簡潔に、優雅に見せることができます.次に、プログラミングで使用される周波数の高いシフト演算を見てみましょう.
本プログラムはVS 2010コンパイラの下で実行され、VS 2010ではintが4バイト(32ビット)を占め、以下のプログラムもint型変数(定数)のみを考慮する.
本プログラムはVS 2010コンパイラの下で実行され、VS 2010ではintが4バイト(32ビット)を占め、以下のプログラムもint型変数(定数)のみを考慮する.
// shiftOperation.cpp : 。
/*******************************************
author: Jerry
functoin:
********************************************/
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// int
cout<<((1<<31)-1)<<endl; //int 4 , 2^32 , , 2^31-1( )
// int
cout<<(1<<31)<<endl; //int
cout<<"==============================
";
//
int p=12344;
if((p&1)==1) // , 1, 0, 1( 1, 0)
{
cout<<p<<" !"<<endl;
}
else
{
cout<<p<<" !"<<endl;
}
cout<<"==============================
";
//
//1.
int a=2,b=3;
a=a*b;
b=a/b;
a=a/b;
cout<<a<<","<<b<<endl;
int c=4,d=5;
c=c+d;
d=c-d;
c=c-d;
cout<<c<<","<<d<<endl;
//2.
int e=6,f=7;
//e=e^f; // e f , e , 1 ( e^f=g(g e ))
//f=f^e; // f , (e^f=g --> f^g=e)
//e=e^f; // f e, f e( ) f
//
e^=f^=e^=f;
cout<<e<<","<<f<<endl;
cout<<"==============================
";
//
// : ( int ) 31 0, 31 -1
int h=-6;
cout<<((h^(h>>31))-(h>>31))<<endl;
// h ,h^0-0=h,
// h ,h^(-1)+1, h -1 , 1,
cout<<"==============================
";
// 、
int i=2,j=3;
//
cout<<((j&((i-j)>>31)) | (i&(~(i-j)>>31)))<<endl; // i-j>=0, 31 0,j&0=0;~(i-j) 31 -1,i&-1=i (-1 1111...1111)
//
cout<<((i&((i-j)>>31)) | (j&(~(i-j)>>31)))<<endl; //
cout<<"==============================
";
// 2
int k=31;
cout<<((k&(k-1))==0)<<endl; // 2 , 1( ),-1 0, 1
cout<<"==============================
";
//
int m=6,n=8;
// , 2
cout<<((m+n)>>1)<<endl;
//
cout<<((m^n)>>1)+(m&n)<<endl; //m^n 1 , 2,m&n 1 ,
cout<<"==============================
";
Sleep(5000);
return 0;
}