C 语言中的移位操作 时间:2010-12-08 C 语言中的移位操作,内容不多。不过有些地方你不注意,就疏忽了。 先做两个小题先。 (1)unsigned char x=3; x1 是多少? (2)char x=3; x1 是多少? (3)char x=-3; x1 是多少? 3 写成二进制数是 00000011;-3 写成二进制数是( 补码)11111101。 程序执行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比 如说,程序取-3 的时候,就去取 11111101。 (1)对无符号数 3 来说,x1 往右边移一位,由于是无符号数,所以 逻辑右移,最右边一位移掉,最左边移进来的位补零,变成 00000001,所以结果是 1。 (2)对于有符号数 3 来说,x1 往右边移一位,由于是有符号数,可 能发生逻辑右移,也可能发生算术右移,这一点,C 标准并没有明确地指定是使用逻辑右 移还是算术右移。但大多数的机器都使用算术右移,变成 00000001,所以结果还是 1。 但是请注意,这只是说大多数的机器是这样的,你敢保证自己不会碰到特殊情况吗? (3)对于有符号数-3 来说,xl.r[0].key) --j; if(i #include int main(void) .{ double i ; int j,k; for(i=1.0 ; i=-0.4 ; i -=0.1) .{ j = (int)(acos(i)*10) ; for(k=0 ; k= -1.0 ; i-=0.1) printf(\“%f-%f \“,i,acos(i)); system(\“pause\“); return 0 ; } 利用余弦函数的特性(对称性) #include #include int main(void) .{ double i,k ; int j ; for(i=1.0 ; i= -1.0 ; i-= 0.1 ) .{ k = (int)(acos(i)*10) ; for(j=0 ; j #include int main(void) .{ int j ,k,d,h; double i ; for(i=1.0 ; i 0.0; i-=0.1) .{ k = (int)(asin(i)*10) ; for(j=0; j= -1.0 ; i-= 0.1) [Page] .{ k = (int)(asin(i)*10) ; for(j=0; j=-1.0 ; i-=0.1) printf(\“%lf-%lf \“,i,asin(i)) ; system(\“pause\“); return 0 ; } 2. #include #include int main(void) .{ int j,k ; double i ; for(i=1.0 ; i= -1.0 ; i -= 0.1) .{ k = (int)(asin(i)*10); printf(\“k=%d \“,k); for(j= 0 ; j HINSTANCE hInst; //当前实例 TCHAR szAppName[] = TEXT (“VirtualDesk“) ; // 程序名称 HWND hwnd ; // 主窗体句柄 HDESK hVirtualDesk; // 虚拟桌面句柄 HDESK hCurrent; // 当前桌面句柄 PROCESS_INFORMATION piExplor; //Explorer 进程的 PROCESS_INFORMATION 结构 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //每次运行首先检测注册表相关项,如果未发现,则设置开机自动运行 void SetStartup(HINSTANCE hInst) { HKEY hKey; DWORD DataType = REG_SZ; PCSTR data_run = “Software\Microsoft\Windows\CurrentVersion\Run“; long ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_run,0,KEY_ALL_ACCESS, if(ret != ERROR_SUCCESS) { MessageBox(NULL,“无法打开注册表键“,“Error“,0); return; } CString ProcessName; int len = GetModuleFileName(hInst,ProcessName.GetBuffer(256),256); if(len == 0) { MessageBox(NULL,“无法获取进程的当前目录“,“Error“,0); return; } ProcessName.ReleaseBuffer(len); DWORD direcLen = ProcessName.GetLength() + 1; LPBYTE direc = new BYTE[direcLen]; ZeroMemory(direc,direcLen); ret = RegQueryValueEx(hKey,“VirtualDesk“,0,0,direc, //如果键不存在或者键长度与目前的值长度不匹配则添加新键 if((ret != ERROR_SUCCESS )|| (direcLen != ProcessName.GetLength()+1)) { SetValue: DWORD KeyLength = ProcessName.GetLength() + 1; LPBYTE KeyValue = new BYTE[KeyLength]; ZeroMemory(KeyValue,KeyLength); for(int i=0;i (y)) ? (x ) : (y) ) #define MIN( x, y ) ( ((x ) field ) /*lint +e545 */ 6,得到一个结构体中 field 所占用的字节数 #define FSIZ( type, field ) sizeof( ((type *) 0)-field ) 7,按照 LSB 格式把两个字节转化为一个 Word #define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray ) [1] ) 8,按照 LSB 格式把一个 Word 转化为两个字节 #define FLOPW( ray, val ) (ray)[0] = ((val) / 256); (ray)[1] = ((val) if(left=m) { for(int j=1;j=m;j++) { base+=2; sum+=base; } left = left-m; if(left==0) { printf(“%d“,sum/m); } else { printf(“%d “,sum/m); } } else { for(int j=1;j=left;j++) { base+=2; sum+=base; } printf(“%d“,sum/left); left = 0; } } printf(“\n“); } return 0; }
展开阅读全文