锘??xml version="1.0" encoding="utf-8" standalone="yes"?> In order to understand why the application does not minimize properly, we need to look into the MFC code that constructs and displays the main window. By placing a breakpoint in the There are two solutions that can be used to solve the flashing problem. The first solution is to make a subclass of the One may ask if the ProcesShellCommand function, we see that, by default, the AppWnd OnFileNew handler is called. OnFileNew calls the CDocument* CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible) OpenDocument, which creates a new document instance, creates a new frame for the document, and finally displays the window by calling InitialUpdateFrame(pFrame, pDocument, bMakeVisible);, and displays the view and the mainframe window. The reason why the application does not display correctly when a different SW parameter is chosen instead of SW_SHOW, is because InitialUpdateFrame CFrameWnd::ActivateFrame() calls ShowWindow during the initialization of the window in the function. This implies that the call to ShowWindow in InitInstance() is redundant and not needed.The solution
SingleDocumentTemplate and call our derived version of OpenDocument with bMakeVisible = false for the minimized case. This, however, does not solve the case of using SW_MAXMIMIZE. Another solution, which is far more simpler and can be used for any ShowWIndow mode, is to set the application ShowWindow property prior to initializing the window, as shown below: CSingleDocTemplate * pDocTemplate;
pDocTemplate = new CSingleDocTemplate (
IDR_MAINFRAME,
RUNTIME_CLASS(CMyMFCProgramDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMyMFCProgramView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Add the following line:
// Set the initial window display to whatever mode you like
this->m_nCmdShow = SW_MAXIMIZE;
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The following line should be deleted since it is not needed
// for a SDI application that used MFC The one and only window has
// been initialized, so show and update it.
//m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
ShowWindow() line in the InitInstance has no purpose, and why Microsoft put that line there in the first place. The answer is, if one decides to construct an SDI application using the MFC application wizard and checks the option not to use MFC, this line is required to show the window. However, Microsoft should have deleted this line if MFC is used. However, since the vast majority of applications initially display ShowWindow with the SW_SHOW parameter, calling ShowWindow twice (the first time in ActivateFrame, as described above) will not influence the display of the application.
]]>
{
va_list vl;
va_start(vl, pFormatString);<br>
CString strFormat;
strFormat.FormatV(pFormatString, vl); // This Line is important!<br>
// Display message box.
AfxMessageBox(strFormat);
}
void MessageBoxFormatted(HWND hWnd, LPCTSTR pCaption, LPCTSTR pFormatString, ...)
{
va_list vl;
va_start(vl, pFormatString);<br>
TCHAR strFormat[1024]; // Must ensure size!<br>
// Generic version of vsprintf, works for both MBCS and Unicode builds
_vstprintf(strFormat, pFormatString, vl);<br>
// Or use following for more secure code
// _vstprintf_s(strFormat, sizeof(strFormat), pFormatString, vl)<br>
::MessageBox(hWnd, strFormat, pCaption,MB_ICONINFORMATION);
}
]]>
1錛庡嚱鏁版寚閽堝畾涔?/span>
鍑芥暟綾誨瀷 錛?/font>*鎸囬拡鍙橀噺鍚嶏級(褰㈠弬鍒楄〃)錛?/span>
“鍑芥暟綾誨瀷”璇存槑鍑芥暟鐨勮繑鍥炵被鍨嬶紝鐢變簬“()”鐨勪紭鍏堢駭楂樹簬“*”,鎵浠ユ寚閽堝彉閲忓悕澶栫殑鎷彿蹇呬笉鍙皯錛屽悗闈㈢殑“褰㈠弬鍒楄〃”琛ㄧず鎸囬拡鍙橀噺鎸囧悜鐨勫嚱鏁版墍甯︾殑鍙傛暟鍒楄〃銆?/span>
渚嬪錛?/span>
int (*f)(int x);
double (*ptr)(double x);
鍦ㄥ畾涔夊嚱鏁版寚閽堟椂璇鋒敞鎰忥細
鍑芥暟鎸囬拡鍜屽畠鎸囧悜鐨勫嚱鏁扮殑鍙傛暟涓暟鍜岀被鍨嬮兘搴旇鏄?/font>鈥?/span>鑷寸殑錛?/span>
鍑芥暟鎸囬拡鐨勭被鍨嬪拰鍑芥暟鐨勮繑鍥炲肩被鍨嬩篃蹇呴』鏄竴鑷寸殑銆?/span>
2錛庡嚱鏁版寚閽堢殑璧嬪?/span>
鍑芥暟鍚嶅拰鏁扮粍鍚嶄竴鏍蜂唬琛ㄤ簡鍑芥暟浠g爜鐨勯鍦板潃錛屽洜姝ゅ湪璧嬪兼椂錛岀洿鎺ュ皢鍑芥暟鎸囬拡鎸囧悜鍑芥暟鍚嶅氨琛屼簡銆?/span>
渚嬪錛?/span>
int func(int x); /* 澹版槑涓涓嚱鏁?/font> */
int (*f) (int x); /* 澹版槑涓涓嚱鏁版寚閽?/font> */
f=func; /* 灝?/font>func鍑芥暟鐨勯鍦板潃璧嬬粰鎸囬拡f */
璧嬪兼椂鍑芥暟func涓嶅甫鎷彿錛屼篃涓嶅甫鍙傛暟錛岀敱浜?/font>func浠h〃鍑芥暟鐨勯鍦板潃錛屽洜姝ょ粡榪囪祴鍊間互鍚庯紝鎸囬拡f灝辨寚鍚戝嚱鏁?/font>func(x)鐨勪唬鐮佺殑棣栧湴鍧銆?/span>
3錛庨氳繃鍑芥暟鎸囬拡璋冪敤鍑芥暟
鍑芥暟鎸囬拡鏄氳繃鍑芥暟鍚嶅強鏈夊叧鍙傛暟榪涜璋冪敤鐨勩?/span>
涓庡叾浠栨寚閽堝彉閲忕浉綾諱技錛屽鏋滄寚閽堝彉閲?/font>pi鏄寚鍚戞煇鏁村瀷鍙橀噺i鐨勬寚閽堬紝鍒?/font>*p絳変簬瀹冩墍鎸囩殑鍙橀噺i錛涘鏋?/font>pf鏄寚鍚戞煇嫻偣鍨嬪彉閲?/font>f鐨勬寚閽堬紝鍒?/font>*pf灝辯瓑浠蜂簬瀹冩墍鎸囩殑鍙橀噺f銆傚悓鏍峰湴錛?/font>*f鏄寚鍚戝嚱鏁?/font>func(x)鐨勬寚閽堬紝鍒?/font>*f灝變唬琛ㄥ畠鎵鎸囧悜鐨勫嚱鏁?/font>func銆傛墍浠ュ湪鎵ц浜?/font>f=func;涔嬪悗錛?/font>(*f)鍜?/font>func浠h〃鍚屼竴鍑芥暟銆?/span>
鐢變簬鍑芥暟鎸囬拡鎸囧悜瀛樺偍鍖轟腑鐨勬煇涓嚱鏁幫紝鍥犳鍙互閫氳繃鍑芥暟鎸囬拡璋冪敤鐩稿簲鐨勫嚱鏁般傜幇鍦ㄦ垜浠氨璁ㄨ濡備綍鐢ㄥ嚱鏁版寚閽堣皟鐢ㄥ嚱鏁幫紝瀹冨簲鎵ц涓嬮潰涓夋錛?/span>
棣栧厛錛岃璇存槑鍑芥暟鎸囬拡鍙橀噺銆?/span>
渚嬪錛?/font>int (*f)(int x);
鍏舵錛岃瀵瑰嚱鏁版寚閽堝彉閲忚祴鍊箋?/span>
渚嬪錛?/font> f=func; (func(x)蹇呴』鍏堣鏈夊畾涔?/font>)
鏈鍚庯紝瑕佺敤 (*鎸囬拡鍙橀噺)(鍙傛暟琛?/font>);璋冪敤鍑芥暟銆?/span>
渚嬪錛?/font> (*f)(x);(x蹇呴』鍏堣祴鍊?/font>)
涓銆?/span> 鍦ㄥ瓧絎︿覆鍓嶅姞涓涓?/span>L浣滅敤:
濡?/span> L"鎴戠殑瀛楃涓?/span>" 琛ㄧず灝?/span>ANSI瀛楃涓茶漿鎹㈡垚unicode鐨勫瓧絎︿覆錛屽氨鏄瘡涓瓧絎﹀崰鐢ㄤ袱涓瓧鑺傘?/span>
strlen("asd") = 3;
strlen(L"asd") = 6;
浜屻?/span> _T瀹忓彲浠ユ妸涓涓紩鍙峰紩璧鋒潵鐨勫瓧絎︿覆錛屾牴鎹綘鐨勭幆澧冭緗紝浣垮緱緙栬瘧鍣ㄤ細鏍規嵁緙栬瘧鐩爣鐜閫夋嫨鍚堥傜殑錛?/span>Unicode榪樻槸ANSI錛夊瓧絎﹀鐞嗘柟寮?/span>
濡傛灉浣犲畾涔変簡UNICODE錛岄偅涔?/span>_T瀹忎細鎶婂瓧絎︿覆鍓嶉潰鍔犱竴涓?/span>L銆傝繖鏃?/span> _T("ABCD") 鐩稿綋浜?/span> L"ABCD" 錛岃繖鏄瀛楃涓層?/span>
濡傛灉娌℃湁瀹氫箟錛岄偅涔?/span>_T瀹忎笉浼氬湪瀛楃涓插墠闈㈠姞閭d釜L錛?/span>_T("ABCD") 灝辯瓑浠蜂簬 "ABCD"
涓夈?/span>TEXT,_TEXT 鍜?/span>_T 涓鏍風殑
濡備笅闈笁璇彞錛?/span>
TCHAR szStr1[] = TEXT("str1");
char szStr2[] = "str2";
WCHAR szStr3[] = L("str3");
閭d箞絎竴鍙ヨ瘽鍦ㄥ畾涔変簡UNICODE鏃朵細瑙i噴涓虹涓夊彞璇濓紝娌℃湁瀹氫箟鏃跺氨絳変簬絎簩鍙ヨ瘽銆?/span>
浣嗕簩鍙ヨ瘽鏃犺鏄惁瀹氫箟浜?/span>UNICODE閮芥槸鐢熸垚涓涓?/span>ANSI瀛楃涓詫紝鑰岀涓夊彞璇濇繪槸鐢熸垚UNICODE瀛楃涓層?/span>
涓轟簡紼嬪簭鐨勫彲縐繪鎬э紝寤鴻閮界敤絎竴縐嶈〃紺烘柟娉曘?/span>
浣嗗湪鏌愪簺鎯呭喌涓嬶紝鏌愪釜瀛楃蹇呴』涓?/span>ANSI鎴?/span>UNICODE錛岄偅灝辯敤鍚庝袱縐嶆柟娉曘?/span>
Many C++ Windows programmers get confused over what bizarre identifiers like TCHAR, LPCTSTR are. Here, in brief, I would try to clear out the fog.
In general, a character can be 1 byte or 2 bytes. Lets say 1-byte character is ANSI, using which English characters are represented. And lets say 2-byte character is Unicode, which can represent ALL languages in the world.
VC++ support char and wchar_t as native datatypes for ANSI and Unicode characters respectively.
What if you want your C/C++ program to be Character-mode independent?
That means, instead of replacing:
Collapse | Copy Code
char cResponse; // 'Y' or 'N'
char sUsername[64];
// str* functions
with
Collapse | Copy Code
wchar_t cResponse; // 'Y' or 'N'
wchar_t sUsername[64];
// wcs* functions
You can simply code it:
Collapse | Copy Code
#include<TCHAR.H> // Implicit or explicit include
TCHAR cResponse; // 'Y' or 'N'
TCHAR sUsername[64];
// _tcs* functions
Thus, when your project is being compiled as Unicode, the TCHAR would translate to wchar_t. If it is being compiled as ANSI/MBCS, it would translated to char. Likewise, instead of using strcpy, strlen, strcat (including the secure versions suffixed with _s); or wcscpy, wcslen, wcscat (including secure), you can simply use _tcscpy, _tcslen, _tcscat functions.
When you need to express hard-coded string, you can use:
Collapse | Copy Code
"ANSI String"; // ANSI
L"Unicode String"; // Unicode
_T("Either string, depending on compilation"); // ANSI or Unicode
// or use TEXT macro, if you need more readability.
The non-prefixed string is ANSI string, the L prefixed string is Unicode, and string specified in _T or TEXT would be either, depending on compilation.
String classes, like MFC/ATL's CString implement two version using macro. There are two classes named CStringA for ANSI, CStringW for Unicode. When you use CString (which is a macro/typedef), it translates to either of two classes.
Okay. The TCHAR type-definition was for a single character. You can definitely declare an array of TCHAR.
What if you want to express a character-pointer, or a const-character-pointer - Which one of the following?
Collapse | Copy Code
// ANSI characters
foo_ansi(char*);
foo_ansi(const char*);
/*const*/ char* pString;
// Unicode/wide-string
foo_uni(WCHAR*); // or wchar_t*
foo_uni(const WCHAR*);
/*const*/ WCHAR* pString;
// Independent
foo_char(TCHAR*);
foo_char(const TCHAR*);
/*const*/ TCHAR* pString;
After reading about TCHAR stuff, you'd definitely select the last one as your choice. But here is better alternative. Before that, note that TCHAR.H header file declares only TCHAR datatype and for the following stuff, you need to include Windows.h (defined in WinNT.h).
NOTE: If your project implicitly or explicitly includes Windows.h, you need not to include TCHAR.H
Now, I hope, you understand the following signatures :
Collapse | Copy Code
BOOL SetCurrentDirectory( LPCTSTR lpPathName );
DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);
Continuing. You must have seen some functions/methods asking you to pass number of characters, or returning the number of characters. Well, like GetCurrentDirectory, you need to pass number of characters, and not number of bytes. For example::
Collapse | Copy Code
TCHAR sCurrentDir[255];
// Pass 255 and not 255*2
GetCurrentDirectory(sCurrentDir, 255);
On the other side, if you need to allocate number or characters, you must allocate proper number of bytes. In C++, you can simply use new:
Collapse | Copy Code
LPTSTR pBuffer; // TCHAR*
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.
But if you use memory allocation functions like malloc, LocalAlloc, GlobalAlloc etc; you must specify the number of bytes!
Collapse | Copy Code
pBuffer = (TCHAR*) malloc (128 * sizeof(TCHAR) );
Typecasting the return value is required, as you know. The expression in malloc's argument ensures that it allocates desired number of bytes - and makes up room for desired number of characters.
1
鏈枃浠庝粙緇嶅熀紜姒傚康鍏ユ墜錛屾帰璁ㄤ簡鍦–/C++涓鏃ユ湡鍜屾椂闂存搷浣滄墍鐢ㄥ埌鐨勬暟鎹粨鏋勫拰鍑芥暟錛屽茍瀵硅鏃躲佹椂闂寸殑鑾峰彇銆佹椂闂寸殑璁$畻鍜屾樉紺烘牸寮忕瓑鏂歸潰榪涜浜嗛槓榪般傛湰鏂囪繕閫氳繃澶ч噺鐨勫疄渚嬪悜浣犲睍紺轟簡time.h澶存枃浠朵腑澹版槑鐨勫悇縐嶅嚱鏁板拰鏁版嵁緇撴瀯鐨勮緇嗕嬌鐢ㄦ柟娉曘?nbsp;
鍏抽敭瀛楋細UTC錛堜笘鐣屾爣鍑嗘椂闂達級錛孋alendar Time錛堟棩鍘嗘椂闂達級錛宔poch錛堟椂闂寸偣錛夛紝clock tick錛堟椂閽熻鏃跺崟鍏冿級
1錛庢蹇?nbsp;
鍦–/C++涓紝瀵瑰瓧絎︿覆鐨勬搷浣滄湁寰堝鍊煎緱娉ㄦ剰鐨勯棶棰橈紝鍚屾牱錛孋/C++瀵規椂闂寸殑鎿嶄綔涔熸湁璁稿鍊煎緱澶у娉ㄦ剰鐨勫湴鏂廣傛渶榪戯紝鍦ㄦ妧鏈兢涓湁寰堝緗戝弸涔熷嬈¢棶鍒?榪嘋++璇█涓鏃墮棿鐨勬搷浣溿佽幏鍙栧拰鏄劇ず絳夌瓑鐨勯棶棰樸備笅闈紝鍦ㄨ繖綃囨枃绔犱腑錛岀瑪鑰呭皢涓昏浠嬬粛鍦–/C++涓椂闂村拰鏃ユ湡鐨勪嬌鐢ㄦ柟娉?
閫氳繃瀛︿範璁稿C/C++搴擄紝浣犲彲浠ユ湁寰堝鎿嶄綔銆佷嬌鐢ㄦ椂闂寸殑鏂規硶銆備絾鍦ㄨ繖涔嬪墠浣犻渶瑕佷簡瑙d竴浜?#8220;鏃墮棿”鍜?#8220;鏃ユ湡”鐨勬蹇碉紝涓昏鏈変互涓嬪嚑涓細
Coordinated Universal Time錛圲TC錛夛細鍗忚皟涓栫晫鏃訛紝鍙堢О涓轟笘鐣屾爣鍑嗘椂闂達紝涔熷氨鏄ぇ瀹舵墍鐔熺煡鐨勬牸鏋楀▉娌繪爣鍑嗘椂闂達紙Greenwich Mean Time錛孏MT錛夈傛瘮濡傦紝涓浗鍐呭湴鐨勬椂闂翠笌UTC鐨勬椂宸負+8錛屼篃灝辨槸UTC+8銆傜編鍥芥槸UTC-5銆?nbsp;
Calendar Time錛氭棩鍘嗘椂闂達紝鏄敤“浠庝竴涓爣鍑嗘椂闂寸偣鍒版鏃剁殑鏃墮棿緇忚繃鐨勭鏁?#8221;鏉ヨ〃紺虹殑鏃墮棿銆傝繖涓爣鍑嗘椂闂寸偣瀵逛笉鍚岀殑緙栬瘧鍣ㄦ潵璇翠細鏈夋墍涓嶅悓錛屼絾瀵逛竴涓紪璇戠郴緇熸潵 璇達紝榪欎釜鏍囧噯鏃墮棿鐐規槸涓嶅彉鐨勶紝璇ョ紪璇戠郴緇熶腑鐨勬椂闂村搴旂殑鏃ュ巻鏃墮棿閮介氳繃璇ユ爣鍑嗘椂闂寸偣鏉ヨ 閲忥紝鎵浠ュ彲浠ヨ鏃ュ巻鏃墮棿鏄?#8220;鐩稿鏃墮棿”錛屼絾鏄棤璁轟綘鍦ㄥ摢涓涓椂鍖猴紝 鍦ㄥ悓涓鏃跺埢瀵瑰悓涓涓爣鍑嗘椂闂寸偣鏉ヨ錛屾棩鍘嗘椂闂撮兘鏄竴鏍風殑銆?nbsp;
epoch錛?nbsp; 鏃墮棿鐐廣傛椂闂寸偣鍦ㄦ爣鍑咰/C++涓槸涓涓暣鏁幫紝瀹冪敤姝ゆ椂鐨勬椂闂村拰鏍囧噯鏃墮棿鐐圭浉宸殑縐掓暟錛堝嵆鏃ュ巻鏃墮棿錛夋潵琛ㄧず銆?nbsp;
clock tick錛氭椂閽熻鏃跺崟鍏冿紙鑰屼笉鎶婂畠鍙仛鏃墮挓婊寸瓟嬈℃暟錛夛紝涓涓椂閽熻鏃跺崟鍏冪殑鏃墮棿闀跨煭鏄敱CPU鎺у埗鐨勩備竴涓猚lock tick涓嶆槸CPU鐨勪竴涓椂閽熷懆鏈燂紝鑰屾槸C/C++鐨勪竴涓熀鏈鏃跺崟浣嶃?nbsp;
鎴戜滑鍙互浣跨敤ANSI鏍囧噯搴撲腑鐨則ime.h澶存枃浠躲傝繖涓ご鏂囦歡涓畾涔夌殑鏃墮棿鍜屾棩鏈熸墍浣跨敤鐨勬柟娉曪紝鏃犺鏄湪緇撴瀯瀹氫箟錛岃繕鏄懡鍚嶏紝閮藉叿鏈夋槑鏄劇殑C璇█椋庢牸銆備笅闈紝鎴戝皢璇存槑鍦–/C++涓庢牱浣跨敤鏃ユ湡鐨勬椂闂村姛鑳姐?nbsp;
2錛?璁℃椂
C/C++涓殑璁℃椂鍑芥暟鏄痗lock()錛岃屼笌鍏剁浉鍏崇殑鏁版嵁綾誨瀷鏄痗lock_t銆傚湪MSDN涓紝鏌ュ緱瀵筩lock鍑芥暟瀹氫箟濡備笅錛?nbsp;
clock_t clock( void );
榪?涓嚱鏁拌繑鍥炰粠“寮鍚繖涓▼搴忚繘紼?#8221;鍒?#8220;紼嬪簭涓皟鐢╟lock()鍑芥暟”鏃朵箣闂寸殑CPU鏃墮挓璁℃椂鍗曞厓錛坈lock tick錛夋暟錛屽湪MSDN涓О涔嬩負鎸傞挓鏃墮棿錛坵al-clock錛夈傚叾涓璫lock_t鏄敤鏉ヤ繚瀛樻椂闂寸殑鏁版嵁綾誨瀷錛屽湪time.h鏂囦歡涓紝鎴戜滑鍙互鎵懼埌瀵?瀹冪殑瀹氫箟錛?nbsp;
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
寰堟槑鏄撅紝clock_t鏄竴涓暱鏁村艦鏁般傚湪time.h鏂囦歡涓紝榪樺畾涔変簡涓涓父閲廋LOCKS_PER_SEC錛屽畠鐢ㄦ潵琛ㄧず涓縐掗挓浼氭湁澶氬皯涓椂閽熻鏃跺崟鍏冿紝鍏跺畾涔夊涓嬶細
#define CLOCKS_PER_SEC ((clock_t)1000)
鍙互鐪嬪埌姣忚繃鍗冨垎涔嬩竴縐掞紙1姣錛夛紝璋冪敤clock錛堬級鍑芥暟榪斿洖鐨勫煎氨鍔?銆備笅闈婦涓緥瀛愶紝浣犲彲浠ヤ嬌鐢ㄥ叕寮廲lock()/CLOCKS_PER_SEC鏉ヨ綆椾竴涓繘紼嬭嚜韜殑榪愯鏃墮棿錛?nbsp;
void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}
褰撶劧錛屼綘涔熷彲浠ョ敤clock鍑芥暟鏉ヨ綆椾綘鐨勬満鍣ㄨ繍琛屼竴涓驚鐜垨鑰呭鐞嗗叾瀹冧簨浠跺埌搴曡姳浜嗗灝戞椂闂達細
#include “stdio.h”
#include “stdlib.h”
#include “time.h”
int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 嫻嬮噺涓涓簨浠舵寔緇殑鏃墮棿*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}
鍦ㄧ瑪鑰呯殑鏈哄櫒涓婏紝榪愯緇撴灉濡備笅錛?nbsp;
Time to do 10000000 empty loops is 0.03000 seconds
涓婇潰鎴戜滑鐪嬪埌鏃墮挓璁℃椂鍗曞厓鐨勯暱搴︿負1姣錛岄偅涔堣鏃剁殑綺懼害涔熶負1姣錛岄偅涔堟垜浠彲涓嶅彲浠ラ氳繃鏀瑰彉CLOCKS_PER_SEC鐨勫畾涔夛紝閫氳繃鎶婂畠瀹氫箟鐨勫ぇ涓浜涳紝浠庤屼嬌璁℃椂綺懼害鏇撮珮鍛紵閫氳繃灝濊瘯錛屼綘浼氬彂鐜拌繖鏍鋒槸涓嶈鐨勩傚湪鏍囧噯C/C++涓紝鏈灝忕殑璁℃椂鍗曚綅鏄竴姣銆?nbsp;
3錛庝笌鏃ユ湡鍜屾椂闂寸浉鍏崇殑鏁版嵁緇撴瀯
鍦ㄦ爣鍑咰/C++涓紝鎴戜滑鍙氳繃tm緇撴瀯鏉ヨ幏寰楁棩鏈熷拰鏃墮棿錛宼m緇撴瀯鍦╰ime.h涓殑瀹氫箟濡備笅錛?nbsp;
#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 縐?– 鍙栧煎尯闂翠負[0,59] */
int tm_min; /* 鍒?- 鍙栧煎尯闂翠負[0,59] */
int tm_hour; /* 鏃?- 鍙栧煎尯闂翠負[0,23] */
int tm_mday; /* 涓涓湀涓殑鏃ユ湡 - 鍙栧煎尯闂翠負[1,31] */
int tm_mon; /* 鏈堜喚錛堜粠涓鏈堝紑濮嬶紝0浠h〃涓鏈堬級 - 鍙栧煎尯闂翠負[0,11] */
int tm_year; /* 騫翠喚錛屽叾鍊肩瓑浜庡疄闄呭勾浠藉噺鍘?900 */
int tm_wday; /* 鏄熸湡 – 鍙栧煎尯闂翠負[0,6]錛屽叾涓?浠h〃鏄熸湡澶╋紝1浠h〃鏄熸湡涓錛屼互姝ょ被鎺?*/
int tm_yday; /* 浠庢瘡騫寸殑1鏈?鏃ュ紑濮嬬殑澶╂暟 – 鍙栧煎尯闂翠負[0,365]錛屽叾涓?浠h〃1鏈?鏃ワ紝1浠h〃1鏈?鏃ワ紝浠ユ綾繪帹 */
int tm_isdst; /* 澶忎護鏃舵爣璇嗙錛屽疄琛屽浠ゆ椂鐨勬椂鍊欙紝tm_isdst涓烘銆備笉瀹炶澶忎護鏃剁殑榪涘欙紝tm_isdst涓?錛涗笉浜嗚В鎯呭喌鏃訛紝tm_isdst()涓鴻礋銆?/
};
#define _TM_DEFINED
#endif
ANSI C鏍囧噯縐頒嬌鐢╰m緇撴瀯鐨勮繖縐嶆椂闂磋〃紺轟負鍒嗚В鏃墮棿(broken-down time)銆?nbsp;
鑰屾棩鍘嗘椂闂達紙Calendar Time錛夋槸閫氳繃time_t鏁版嵁綾誨瀷鏉ヨ〃紺虹殑錛岀敤time_t琛ㄧず鐨勬椂闂達紙鏃ュ巻鏃墮棿錛夋槸浠庝竴涓椂闂寸偣錛堜緥濡傦細1970騫?鏈?鏃?鏃?鍒?縐掞級鍒版鏃剁殑縐掓暟銆傚湪time.h涓紝鎴戜滑涔熷彲浠ョ湅鍒皌ime_t鏄竴涓暱鏁村瀷鏁幫細
#ifndef _TIME_T_DEFINED
typedef long time_t; /* 鏃墮棿鍊?*/
#define _TIME_T_DEFINED /* 閬垮厤閲嶅瀹氫箟 time_t */
#endif
澶?瀹跺彲鑳戒細浜х敓鐤戦棶錛氭棦鐒秚ime_t瀹為檯涓婃槸闀挎暣鍨嬶紝鍒版湭鏉ョ殑鏌愪竴澶╋紝浠庝竴涓椂闂寸偣錛堜竴鑸槸1970騫?鏈?鏃?鏃?鍒?縐掞級鍒伴偅鏃剁殑縐掓暟錛堝嵆鏃ュ巻鏃墮棿錛?瓚呭嚭浜嗛暱鏁村艦鎵鑳借〃紺虹殑鏁扮殑鑼冨洿鎬庝箞鍔烇紵瀵箃ime_t鏁版嵁綾誨瀷鐨勫兼潵璇達紝瀹冩墍琛ㄧず鐨勬椂闂翠笉鑳芥櫄浜?038騫?鏈?8鏃?9鏃?4鍒?7縐掋備負浜嗚兘澶熻〃紺?鏇翠箙榪滅殑鏃墮棿錛屼竴浜涚紪璇戝櫒鍘傚晢寮曞叆浜?4浣嶇敋鑷蟲洿闀跨殑鏁村艦鏁版潵淇濆瓨鏃ュ巻鏃墮棿銆傛瘮濡傚井杞湪Visual C++涓噰鐢ㄤ簡__time64_t鏁版嵁綾誨瀷鏉ヤ繚瀛樻棩鍘嗘椂闂達紝騫墮氳繃_time64()鍑芥暟鏉ヨ幏寰楁棩鍘嗘椂闂達紙鑰屼笉鏄氳繃浣跨敤32浣嶅瓧鐨則ime()鍑?鏁幫級錛岃繖鏍峰氨鍙互閫氳繃璇ユ暟鎹被鍨嬩繚瀛?001騫?鏈?鏃?鏃?鍒?縐掞紙涓嶅寘鎷鏃墮棿鐐癸級涔嬪墠鐨勬椂闂淬?nbsp;
鍦╰ime.h澶存枃浠朵腑錛屾垜浠繕鍙互鐪嬪埌涓浜涘嚱鏁幫紝瀹冧滑閮芥槸浠ime_t涓哄弬鏁扮被鍨嬫垨榪斿洖鍊肩被鍨嬬殑鍑芥暟錛?nbsp;
double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);
姝ゅ錛宼ime.h榪樻彁渚涗簡涓ょ涓嶅悓鐨勫嚱鏁板皢鏃ュ巻鏃墮棿錛堜竴涓敤time_t琛ㄧず鐨勬暣鏁幫級杞崲涓烘垜浠鉤鏃剁湅鍒扮殑鎶婂勾鏈堟棩鏃跺垎縐掑垎寮鏄劇ず鐨勬椂闂存牸寮弔m錛?nbsp;
struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);
閫?榪囨煡闃匨SDN錛屾垜浠彲浠ョ煡閬揗icrosoft C/C++ 7.0涓椂闂寸偣鐨勫鹼紙time_t瀵硅薄鐨勫鹼級鏄粠1899騫?2鏈?1鏃?鏃?鍒?縐掑埌璇ユ椂闂寸偣鎵緇忚繃鐨勭鏁幫紝鑰屽叾瀹冨悇縐嶇増鏈殑Microsoft C/C++鍜屾墍鏈変笉鍚岀増鏈殑Visual C++閮芥槸璁$畻鐨勪粠1970騫?鏈?鏃?鏃?鍒?縐掑埌璇ユ椂闂寸偣鎵緇忚繃鐨勭鏁般?nbsp;
4錛庝笌鏃ユ湡鍜屾椂闂寸浉鍏崇殑鍑芥暟鍙婂簲鐢?nbsp;
鍦ㄦ湰鑺傦紝鎴戝皢鍚戝ぇ瀹跺睍紺烘庢牱鍒╃敤time.h涓0鏄庣殑鍑芥暟瀵規椂闂磋繘琛屾搷浣溿傝繖浜涙搷浣滃寘鎷彇褰撳墠鏃墮棿銆佽綆楁椂闂撮棿闅斻佷互涓嶅悓鐨勫艦寮忔樉紺烘椂闂寸瓑鍐呭銆?nbsp;
4.1 鑾峰緱鏃ュ巻鏃墮棿
鎴戜滑鍙互閫氳繃time()鍑芥暟鏉ヨ幏寰楁棩鍘嗘椂闂達紙Calendar Time錛夛紝鍏跺師鍨嬩負錛?br>time_t time(time_t * timer);
濡?鏋滀綘宸茬粡澹版槑浜嗗弬鏁皌imer錛屼綘鍙互浠庡弬鏁皌imer榪斿洖鐜板湪鐨勬棩鍘嗘椂闂達紝鍚屾椂涔熷彲浠ラ氳繃榪斿洖鍊艱繑鍥炵幇鍦ㄧ殑鏃ュ巻鏃墮棿錛屽嵆浠庝竴涓椂闂寸偣錛堜緥濡傦細1970騫?1鏈?鏃?鏃?鍒?縐掞級鍒扮幇鍦ㄦ鏃剁殑縐掓暟銆傚鏋滃弬鏁頒負絀猴紙NUL錛夛紝鍑芥暟灝嗗彧閫氳繃榪斿洖鍊艱繑鍥炵幇鍦ㄧ殑鏃ュ巻鏃墮棿錛屾瘮濡備笅闈㈣繖涓緥瀛愮敤鏉ユ樉紺哄綋鍓嶇殑鏃ュ巻鏃墮棿錛?
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
printf("The Calendar Time now is %d\n",lt);
return 0;
}
榪愯鐨勭粨鏋滀笌褰撴椂鐨勬椂闂存湁鍏籌紝鎴戝綋鏃惰繍琛岀殑緇撴灉鏄細
The Calendar Time now is 1122707619
鍏朵腑1122707619灝辨槸鎴戣繍琛岀▼搴忔椂鐨勬棩鍘嗘椂闂淬傚嵆浠?970騫?鏈?鏃?鏃?鍒?縐掑埌姝ゆ椂鐨勭鏁般?nbsp;
4.2 鑾峰緱鏃ユ湡鍜屾椂闂?nbsp;
榪欓噷璇寸殑鏃ユ湡鍜屾椂闂村氨鏄垜浠鉤鏃舵墍璇寸殑騫淬佹湀銆佹棩銆佹椂銆佸垎銆佺絳変俊鎭備粠絎?鑺傛垜浠凡緇忕煡閬撹繖浜涗俊鎭兘淇濆瓨鍦ㄤ竴涓悕涓簍m鐨勭粨鏋勪綋涓紝閭d箞濡備綍灝嗕竴涓棩鍘嗘椂闂翠繚瀛樹負涓涓猼m緇撴瀯鐨勫璞″憿錛?nbsp;
鍏朵腑鍙互浣跨敤鐨勫嚱鏁版槸gmtime()鍜宭ocaltime()錛岃繖涓や釜鍑芥暟鐨勫師鍨嬩負錛?nbsp;
struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);
鍏?涓璯mtime()鍑芥暟鏄皢鏃ュ巻鏃墮棿杞寲涓轟笘鐣屾爣鍑嗘椂闂達紙鍗蟲牸鏋楀凹娌繪椂闂達級錛屽茍榪斿洖涓涓猼m緇撴瀯浣撴潵淇濆瓨榪欎釜鏃墮棿錛岃宭ocaltime()鍑芥暟鏄皢鏃ュ巻 鏃墮棿杞寲涓烘湰鍦版椂闂淬傛瘮濡傜幇鍦ㄧ敤gmtime()鍑芥暟鑾峰緱鐨勪笘鐣屾爣鍑嗘椂闂存槸2005騫?鏈?0鏃?鐐?8鍒?0縐掞紝閭d箞鎴戠敤localtime()鍑芥暟鍦?涓浗鍦板尯鑾峰緱鐨勬湰鍦版椂闂翠細姣斾笘鐣屾爣鍑嗘椂闂存櫄8涓皬鏃訛紝鍗?005騫?鏈?0鏃?5鐐?8鍒?0縐掋備笅闈㈡槸涓緥瀛愶細
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}
榪愯緇撴灉鏄細
Local hour is: 15
UTC hour is: 7
4.3 鍥哄畾鐨勬椂闂存牸寮?nbsp;
鎴戜滑鍙互閫氳繃asctime()鍑芥暟鍜宑time()鍑芥暟灝嗘椂闂翠互鍥哄畾鐨勬牸寮忔樉紺哄嚭鏉ワ紝涓よ呯殑榪斿洖鍊奸兘鏄痗har*鍨嬬殑瀛楃涓層傝繑鍥炵殑鏃墮棿鏍煎紡涓猴細
鏄熸湡鍑?鏈堜喚 鏃ユ湡 鏃?鍒?縐?騫碶n\0
渚嬪錛歐ed Jan 02 02:03:55 1980\n\0
鍏朵腑\n鏄竴涓崲琛岀錛孿0鏄竴涓┖瀛楃錛岃〃紺哄瓧絎︿覆緇撴潫銆備笅闈㈡槸涓や釜鍑芥暟鐨勫師鍨嬶細
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);
鍏?涓璦sctime()鍑芥暟鏄氳繃tm緇撴瀯鏉ョ敓鎴愬叿鏈夊浐瀹氭牸寮忕殑淇濆瓨鏃墮棿淇℃伅鐨勫瓧絎︿覆錛岃宑time()鏄氳繃鏃ュ巻鏃墮棿鏉ョ敓鎴愭椂闂村瓧絎︿覆銆傝繖鏍風殑璇濓紝 asctime錛堬級鍑芥暟鍙槸鎶妕m緇撴瀯瀵硅薄涓殑鍚勪釜鍩熷~鍒版椂闂村瓧絎︿覆鐨勭浉搴斾綅緗氨琛屼簡錛岃宑time錛堬級鍑芥暟闇瑕佸厛鍙傜収鏈湴鐨勬椂闂磋緗紝鎶婃棩鍘嗘椂闂磋漿鍖栦負 鏈湴鏃墮棿錛岀劧鍚庡啀鐢熸垚鏍煎紡鍖栧悗鐨勫瓧絎︿覆銆傚湪涓嬮潰錛屽鏋渢鏄竴涓潪絀虹殑time_t鍙橀噺鐨勮瘽錛岄偅涔堬細
printf(ctime(&t));
絳変環浜庯細
struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));
閭d箞錛屼笅闈㈣繖涓▼搴忕殑涓ゆ潯printf璇彞杈撳嚭鐨勭粨鏋滃氨鏄笉鍚岀殑浜嗭紙闄ら潪浣犲皢鏈湴鏃跺尯璁句負涓栫晫鏍囧噯鏃墮棿鎵鍦ㄧ殑鏃跺尯錛夛細
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
ptr=gmtime(<);
printf(asctime(ptr));
printf(ctime(<));
return 0;
}
榪愯緇撴灉錛?nbsp;
Sat Jul 30 08:43:03 2005
Sat Jul 30 16:43:03 2005
4.4 鑷畾涔夋椂闂存牸寮?nbsp;
鎴戜滑鍙互浣跨敤strftime錛堬級鍑芥暟灝嗘椂闂存牸寮忓寲涓烘垜浠兂瑕佺殑鏍煎紡銆傚畠鐨勫師鍨嬪涓嬶細
size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);
鎴戜滑鍙互鏍規嵁format鎸囧悜瀛楃涓蹭腑鏍煎紡鍛戒護鎶妕imeptr涓繚瀛樼殑鏃墮棿淇℃伅鏀懼湪strDest鎸囧悜鐨勫瓧絎︿覆涓紝鏈澶氬悜strDest涓瓨鏀緈axsize涓瓧絎︺傝鍑芥暟榪斿洖鍚憇trDest鎸囧悜鐨勫瓧絎︿覆涓斁緗殑瀛楃鏁般?nbsp;
鍑?鏁皊trftime()鐨勬搷浣滄湁浜涚被浼間簬sprintf()錛氳瘑鍒互鐧懼垎鍙?%)寮濮嬬殑鏍煎紡鍛戒護闆嗗悎錛屾牸寮忓寲杈撳嚭緇撴灉鏀懼湪涓涓瓧絎︿覆涓傛牸寮忓寲鍛戒護璇存槑涓?strDest涓悇縐嶆棩鏈熷拰鏃墮棿淇℃伅鐨勭‘鍒囪〃紺烘柟娉曘傛牸寮忎覆涓殑鍏朵粬瀛楃鍘熸牱鏀捐繘涓蹭腑銆傛牸寮忓懡浠ゅ垪鍦ㄤ笅闈紝瀹冧滑鏄尯鍒嗗ぇ灝忓啓鐨勩?nbsp;
%a 鏄熸湡鍑犵殑綆鍐?nbsp;
%A 鏄熸湡鍑犵殑鍏ㄧО
%b 鏈堝垎鐨勭畝鍐?nbsp;
%B 鏈堜喚鐨勫叏縐?nbsp;
%c 鏍囧噯鐨勬棩鏈熺殑鏃墮棿涓?nbsp;
%C 騫翠喚鐨勫悗涓や綅鏁板瓧
%d 鍗佽繘鍒惰〃紺虹殑姣忔湀鐨勭鍑犲ぉ
%D 鏈?澶?騫?nbsp;
%e 鍦ㄤ袱瀛楃鍩熶腑錛屽崄榪涘埗琛ㄧず鐨勬瘡鏈堢殑絎嚑澶?nbsp;
%F 騫?鏈?鏃?nbsp;
%g 騫翠喚鐨勫悗涓や綅鏁板瓧錛屼嬌鐢ㄥ熀浜庡懆鐨勫勾
%G 騫村垎錛屼嬌鐢ㄥ熀浜庡懆鐨勫勾
%h 綆鍐欑殑鏈堜喚鍚?nbsp;
%H 24灝忔椂鍒剁殑灝忔椂
%I 12灝忔椂鍒剁殑灝忔椂
%j 鍗佽繘鍒惰〃紺虹殑姣忓勾鐨勭鍑犲ぉ
%m 鍗佽繘鍒惰〃紺虹殑鏈堜喚
%M 鍗佹椂鍒惰〃紺虹殑鍒嗛挓鏁?nbsp;
%n 鏂拌絎?nbsp;
%p 鏈湴鐨凙M鎴朠M鐨勭瓑浠鋒樉紺?nbsp;
%r 12灝忔椂鐨勬椂闂?nbsp;
%R 鏄劇ず灝忔椂鍜屽垎閽燂細hh:mm
%S 鍗佽繘鍒剁殑縐掓暟
%t 姘村鉤鍒惰〃絎?nbsp;
%T 鏄劇ず鏃跺垎縐掞細hh:mm:ss
%u 姣忓懆鐨勭鍑犲ぉ錛屾槦鏈熶竴涓虹涓澶?錛堝間粠0鍒?錛屾槦鏈熶竴涓?錛?nbsp;
%U 絎勾鐨勭鍑犲懆錛屾妸鏄熸湡鏃ュ仛涓虹涓澶╋紙鍊間粠0鍒?3錛?nbsp;
%V 姣忓勾鐨勭鍑犲懆錛屼嬌鐢ㄥ熀浜庡懆鐨勫勾
%w 鍗佽繘鍒惰〃紺虹殑鏄熸湡鍑狅紙鍊間粠0鍒?錛屾槦鏈熷ぉ涓?錛?nbsp;
%W 姣忓勾鐨勭鍑犲懆錛屾妸鏄熸湡涓鍋氫負絎竴澶╋紙鍊間粠0鍒?3錛?nbsp;
%x 鏍囧噯鐨勬棩鏈熶覆
%X 鏍囧噯鐨勬椂闂翠覆
%y 涓嶅甫涓栫邯鐨勫崄榪涘埗騫翠喚錛堝間粠0鍒?9錛?nbsp;
%Y 甯︿笘綰儴鍒嗙殑鍗佽繘鍒跺勾浠?nbsp;
%z錛?Z 鏃跺尯鍚嶇О錛屽鏋滀笉鑳藉緱鍒版椂鍖哄悕縐板垯榪斿洖絀哄瓧絎︺?nbsp;
%% 鐧懼垎鍙?nbsp;
濡傛灉鎯蟲樉紺虹幇鍦ㄦ槸鍑犵偣浜嗭紝騫朵互12灝忔椂鍒舵樉紺猴紝灝辮薄涓嬮潰榪欐紼嬪簭錛?nbsp;
#include “time.h”
#include “stdio.h”
int main(void)
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NUL);
ptr=localtime(<);
strftime(str,100,"It is now %I %p",ptr);
printf(str);
return 0;
}
鍏惰繍琛岀粨鏋滀負錛?nbsp;
It is now 4PM
鑰屼笅闈㈢殑紼嬪簭鍒欐樉紺哄綋鍓嶇殑瀹屾暣鏃ユ湡錛?nbsp;
#include <stdio.h>
#include <time.h>
void main( void )
{
struct tm *newtime;
char tmpbuf[128];
time_t lt1;
time( <1 );
newtime=localtime(<1);
strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
printf(tmpbuf);
}
榪愯緇撴灉錛?nbsp;
Today is Saturday, day 30 of July in the year 2005.
4.5 璁$畻鎸佺畫鏃墮棿鐨勯暱搴?nbsp;
鏈夋椂鍊欏湪瀹為檯搴旂敤涓璁$畻涓涓簨浠舵寔緇殑鏃墮棿闀垮害錛屾瘮濡傝綆楁墦瀛楅熷害銆傚湪絎?鑺傝鏃墮儴鍒嗕腑錛屾垜宸茬粡鐢╟lock鍑芥暟涓句簡涓涓緥瀛愩侰lock()鍑芥暟鍙互綺劇‘鍒版縐掔駭銆傚悓鏃訛紝鎴戜滑涔熷彲浠ヤ嬌鐢╠ifftime()鍑芥暟錛屼絾瀹冨彧鑳界簿紜埌縐掋傝鍑芥暟鐨勫畾涔夊涓嬶細
double difftime(time_t time1, time_t time0);
铏界劧璇ュ嚱鏁拌繑鍥炵殑浠ョ璁$畻鐨勬椂闂撮棿闅旀槸double綾誨瀷鐨勶紝浣嗚繖騫朵笉璇存槑璇ユ椂闂村叿鏈夊悓double涓鏍風殑綺劇‘搴︼紝榪欐槸鐢卞畠鐨勫弬鏁拌寰楃殑錛坱ime_t鏄互縐掍負鍗曚綅璁$畻鐨勶級銆傛瘮濡備笅闈竴孌電▼搴忥細
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
time_t start,end;
start = time(NUL);
system("pause");
end = time(NUL);
printf("The pause used %f seconds.\n",difftime(end,start));//<-
system("pause");
return 0;
}
榪愯緇撴灉涓猴細
璇鋒寜浠繪剰閿戶緇? . .
The pause used 2.000000 seconds.
璇鋒寜浠繪剰閿戶緇? . .
鍙互鎯沖儚錛屾殏鍋滅殑鏃墮棿騫朵笉閭d箞宸ф槸鏁存暣2縐掗挓銆傚叾瀹烇紝浣犲皢涓婇潰紼嬪簭鐨勫甫鏈?#8220;//<-”娉ㄩ噴鐨勪竴琛岀敤涓嬮潰鐨勪竴琛屼唬鐮佹浛鎹細
printf("The pause used %f seconds.\n",end-start);
鍏惰繍琛岀粨鏋滄槸涓鏍風殑銆?nbsp;
4.6 鍒嗚В鏃墮棿杞寲涓烘棩鍘嗘椂闂?nbsp;
榪欓噷璇寸殑鍒嗚В鏃墮棿灝辨槸浠ュ勾銆佹湀銆佹棩銆佹椂銆佸垎銆佺絳夊垎閲忎繚瀛樼殑鏃墮棿緇撴瀯錛屽湪C/C++涓槸tm緇撴瀯銆傛垜浠彲浠ヤ嬌鐢╩ktime錛堬級鍑芥暟灝嗙敤tm緇撴瀯琛ㄧず鐨勬椂闂磋漿鍖栦負鏃ュ巻鏃墮棿銆傚叾鍑芥暟鍘熷瀷濡備笅錛?nbsp;
time_t mktime(struct tm * timeptr);
鍏惰繑鍥炲煎氨鏄漿鍖栧悗鐨勬棩鍘嗘椂闂淬傝繖鏍鋒垜浠氨鍙互鍏堝埗瀹氫竴涓垎瑙f椂闂達紝鐒跺悗瀵硅繖涓椂闂磋繘琛屾搷浣滀簡錛屼笅闈㈢殑渚嬪瓙鍙互璁$畻鍑?997騫?鏈?鏃ユ槸鏄熸湡鍑狅細
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}
榪愯緇撴灉錛?nbsp;
Tue Jul 01 00:00:01 1997
鐜板湪娉ㄦ剰浜嗭紝鏈変簡mktime()鍑芥暟錛屾槸涓嶆槸鎴戜滑鍙互鎿嶄綔鐜板湪涔嬪墠鐨勪換浣曟椂闂村憿錛熶綘鍙互閫氳繃榪欑鍔炴硶綆楀嚭1945騫?鏈?5鍙鋒槸鏄熸湡鍑犲悧錛熺瓟妗堟槸鍚﹀畾鐨勩傚洜涓鴻繖涓椂闂村湪1970騫?鏈?鏃ヤ箣鍓嶏紝鎵浠ュ湪澶у鏁扮紪璇戝櫒涓紝榪欐牱鐨勭▼搴忚櫧鐒跺彲浠ョ紪璇戦氳繃錛屼絾榪愯鏃朵細寮傚父緇堟銆?
5錛庢葷粨
鏈枃浠嬬粛浜嗘爣鍑咰/C++涓殑鏈夊叧鏃ユ湡鍜屾椂闂寸殑姒傚康錛屽茍閫氳繃鍚勭瀹炰緥璁茶堪浜嗚繖浜涘嚱鏁板拰鏁版嵁緇撴瀯鐨勪嬌鐢ㄦ柟娉曘傜瑪鑰呰涓猴紝鍜屾椂闂寸浉鍏崇殑涓浜涙蹇墊槸鐩稿綋閲嶈鐨勶紝鐞嗚В榪欎簺姒傚康鏄悊瑙e悇縐嶆椂闂存牸寮忕殑杞崲鐨勫熀紜錛屾洿鏄簲鐢ㄨ繖浜涘嚱鏁板拰鏁版嵁緇撴瀯鐨勫熀紜銆?/p>
涓轟簡鏄劇ず鑷繁鐨勬妧宸э紝涔熷湪鑷繁鐨勭▼搴忎腑鐢ㄨ繃鍑犳銆傛笎娓愬彂鐜拌繖鏍風殑鎶宸у甫鏉ョ殑濂藉鏄湁浠d環鐨勶紝鐮村潖浜嗙▼搴忕殑緇撴瀯鍖栬璁★紝紼嬪簭鍙樺緱寰堥毦璇伙紝灝ゅ叾瀵規柊鎵嬫潵璇淬傜粓浜庢槑鐧借繖縐嶆妧宸т笉榪囨槸涓縐嶈皟鍛蟲枡錛屽湪灝戞暟鎯呭喌浣跨敤鍑犳錛屽彲浠ョ畝鍖栧闂鐨勫鐞嗐傚鏋滄妸璋冨懗鎷挎潵褰撻キ鍚冿紝涓瀹氫細鏈湯鍊掔疆錛屽啓鍑虹殑紼嬪簭浼氬憟鐜拌惀鍏諱笉鑹箣鐘躲?/p>
浜嬪疄涓婏紝longjmp鍜宻etjmp鐜╁緱鐔熶笉鐔熶笌鏄笉鏄疌璇█楂樻墜錛屼笉鏄洜鏋滃叧緋匯備絾鏄紝濡傛灉鍙互濂楃敤閭d綅楂樻墜鐨勮瘽錛屾垜鍊掓兂璇村鏋滃嚱鏁版寚閽堢帺寰椾笉鐔燂紝灝變笉瑕佽嚜縐頒負C璇█楂樻墜銆備負浠涔堣繖涔堣鍛紝鍑芥暟鎸囬拡鏈夐偅涔堝鏉傚悧錛熷綋鐒朵笉鏄紝浠諱綍涓涓◢鏈夌紪紼嬪父璇嗙殑浜猴紝涓嶇浠栨噦涓嶆噦C璇█錛屽湪10鍒嗛挓鍐咃紝鎴戞兂浠栦竴瀹氬彲浠ユ槑鐧紺璇█涓殑鍑芥暟鎸囬拡鏄庝箞鍥炰簨銆?/p>
鍘熷洜鍦ㄤ簬錛岄毦鐨勪笉鏄嚱鏁版寚閽堢殑姒傚康鍜岃娉曟湰韜紝鑰屾槸鍦ㄤ粈涔堟椂鍊欙紝浠涔堝湴鏂硅浣跨敤瀹冦傚嚱鏁版寚閽堜笉浠呮槸璇硶涓婄殑闂錛屾洿閲嶈鐨勬槸瀹冩槸涓涓璁¤寖鐣淬傜湡姝g殑楂樻墜褰撶劧涓嶅崟搴旇鎳傚緱璇硶灞傞潰涓婄殑鎶宸э紝鏇村簲璇ユ噦寰楄璁′笂鐨勬柟娉曘備笉鎳傝璁★紝鑳界畻楂樻墜鍚楋紵鎬鐤戞垜鍦ㄥじ澶у叾杈炲悧錛熼偅鎴戜滑鍏堢湅鐪嬪嚱鏁版寚閽堜笌鍝簺璁捐鏂規硶鏈夊叧錛?/p>
涓庡垎灞傝璁℃湁鍏熾?/strong>鍒嗗眰璁捐鏃╁氨涓嶆槸浠涔堟柊鐨勬蹇碉紝鍒嗗眰鐨勫ソ澶勬槸浼楁墍鍛ㄧ煡鐨勶紝姣旇緝鏄庢樉濂藉灝辨槸綆鍖栧鏉傚害銆侀殧紱誨彉鍖栥傞噰鐢ㄥ垎灞傝璁★紝姣忓眰閮藉彧闇鍏沖績鑷繁鐨勪笢瑗匡紝榪欏噺灝忎簡緋葷粺鐨勫鏉傚害錛屽眰涓庡眰涔嬮棿鐨勪氦浜掍粎闄愪簬涓涓緢紿勭殑鎺ュ彛錛屽彧瑕佹帴鍙d笉鍙橈紝鏌愪竴灞傜殑鍙樺寲涓嶄細褰卞搷鍏跺畠灞傦紝榪欓殧紱諱簡鍙樺寲銆?/p>
鍒嗗眰鐨勪竴鑸師鍒欐槸錛屼笂灞傚彲浠ョ洿鎺ヨ皟鐢ㄤ笅灞傜殑鍑芥暟錛屼笅灞傚垯涓嶈兘鐩存帴璋冪敤涓婂眰鐨勫嚱鏁般傝繖鍙ヨ瘽璇存潵綆鍗曪紝鍦ㄧ幇瀹炰腑錛屼笅灞傚父甯歌鍙嶈繃鏉ヨ皟鐢ㄤ笂灞傜殑鍑芥暟銆傛瘮濡備綘鍦ㄦ嫹璐濇枃浠舵椂錛屽湪鐣岄潰灞傝皟鐢ㄤ竴涓嫹璐濇枃浠跺嚱鏁般傜晫闈㈠眰鏄笂灞傦紝鎷瘋礉鏂囦歡鍑芥暟鏄笅灞傦紝涓婂眰璋冪敤涓嬪眰錛岀悊鎵褰撶劧銆備絾鏄鏋滀綘鎯沖湪鎷瘋礉鏂囦歡鏃惰繕瑕佹洿鏂拌繘搴︽潯錛岄棶棰樺氨鏉ヤ簡銆備竴鏂歸潰錛屽彧鏈夋嫹璐濇枃浠跺嚱鏁版墠鐭ラ亾鎷瘋礉鐨勮繘搴︼紝浣嗗畠涓嶈兘鍘繪洿鏂扮晫闈㈢殑榪涘害鏉°傚彟澶栦竴鏂歸潰錛岀晫闈㈢煡閬撳浣曞幓鏇存柊榪涘害鏉★紝浣嗗畠鍙堜笉鐭ラ亾鎷瘋礉鐨勮繘搴︺傛庝箞鍔烇紵甯歌鐨勫仛娉曪紝灝辨槸鐣岄潰璁劇疆涓涓洖璋冨嚱鏁扮粰鎷瘋礉鏂囦歡鍑芥暟錛屾嫹璐濇枃浠跺嚱鏁板湪閫傚綋鐨勬椂鍊欒皟鐢ㄨ繖涓洖璋冨嚱鏁版潵閫氱煡鐣岄潰鏇存柊鐘舵併?/p>
涓庢娊璞℃湁鍏熾?/strong>鎶借薄鏄潰鍚戝璞′腑鏈閲嶈鐨勬蹇典箣涓錛屼篃鏄潰鍚戝璞″▉鍔涘己澶т箣澶勩傞潰鍚戝璞″彧鏄竴縐嶆濇兂錛屽ぇ瀹墮兘鐭ラ亾錛岀敤C璇█涓鏍峰彲浠ュ疄鐜伴潰鍚戝璞$殑緙栫▼銆傝繖鍙笉鏄負浜嗚刀鏃墮錛岃屾槸涓縐嶅疄鐢ㄧ殑鏂規硶銆傚鏋滀綘瀵規琛ㄧず鎬鐤戯紝鍙互鍘葷湅鐪婫TK+銆乴inux kernel絳夊紑婧愪唬鐮併?/p>
鎺ュ彛鏄渶楂樼駭鐨勬娊璞°傚湪linux kernel閲岄潰錛屾帴鍙g殑姒傚康鏃犲涓嶅湪錛屽儚铏氭嫙鏂囦歡緋葷粺(VFS)錛屽畠瀹氫箟涓涓枃浠剁郴緇熺殑鎺ュ彛錛屽彧瑕佹寜鐓ц繖縐嶆帴鍙g殑瑙勮寖錛屼綘鍙互鑷繁寮鍙戜竴涓枃浠剁郴緇熸寕涓婂幓銆傝澶囬┍鍔ㄧ▼搴忔洿鏄姝わ紝涓嶅悓鐨勮澶囬┍鍔ㄧ▼搴忔湁鑷繁涓濂椾笉鍚岀殑鎺ュ彛瑙勮寖銆傚湪鑷繁寮鍙戣澶囧紑鍙戦┍鍔ㄧ▼搴忔椂錛屽彧瑕侀伒寰浉搴旂殑鎺ュ彛瑙勮寖灝辮浜嗐傛帴鍙e湪C璇█涓浣曡〃紺猴紵寰堢畝鍗曪紝灝辨槸涓緇勫嚱鏁版寚閽堛?/p>
涓庢帴鍙d笌瀹炵幇鍒嗗紑鏈夊叧銆傞拡瀵規帴鍙g紪紼嬶紝鑰屼笉鏄拡瀵瑰疄鐜扮紪紼嬶紝姝や負銆婅璁℃ā寮忋嬬殑絎竴鏉¤璁″噯鍒欍傚垎寮鎺ュ彛涓庡疄鐜扮殑鐩爣鏄闅旂鍙樺寲銆傝蔣浠舵槸鍙樺寲鐨勶紝濡傛灉涓嶈兘鎶婂彉鍖栫殑涓滆タ闅旂寮鏉ワ紝瀵艱嚧鐗典竴鍙戣屽姩鍏ㄨ韓錛屼唬浠鋒槸宸ㄥぇ鐨勩傝繖鏄ぇ瀹舵墍涓嶆効鐪嬪埌鐨勩?/p>
C璇█鏃㈢劧鍙互瀹炵幇闈㈠悜瀵硅薄鐨勭紪紼嬶紝鑷劧鍙互鍒╃敤璁捐妯″紡鏉ュ垎紱繪帴鍙d笌瀹炵幇銆傚儚妗ユ帴妯″紡銆佺瓥鐣ユā寮忋佺姸鎬佹ā寮忋佷唬鐞嗘ā寮忕瓑絳夛紝鍦–璇█涓紝鏃犱竴涓嶉渶瑕佸埄鐢ㄥ嚱鏁版寚閽堟潵瀹炵幇銆?/p>
涓庢澗鑰﹀悎鍘熷垯鏈夊叧銆傞潰鍚戣繃紼嬩笌闈㈠悜瀵硅薄鐩告瘮錛屼箣鎵浠ユ樉寰楄媿鐧芥棤鍔涳紝鍘熷洜涔嬩竴灝辨槸瀹冧笉鍍忛潰鍚戝璞′竴鏍鳳紝鍙互鐩磋鐨勬妸鐜板疄妯″瀷鏄犲皠鍒拌綆楁満涓傞潰鍚戣繃紼嬭鐨勬槸灞傚眰鎺у埗錛岃岄潰鍚戝璞℃洿寮鴻皟鐨勫璞¢棿鐨勫垎宸ュ悎浣溿傜幇瀹炰笘鐣屼腑鐨勫璞″浜庡眰嬈″叧緋葷殑杈冨皯錛屽浜庡絳夊叧緋葷殑灞呭銆備篃灝辨槸璇達紝瀵硅薄闂寸殑浜や簰寰寰鏄弻鍚戠殑銆傝繖浼氬姞寮哄璞¢棿鐨勮﹀悎鎬с?/p>
鑰﹀悎鏈韓娌℃湁閿欙紝瀹為檯涓婅﹀悎鏄繀涓嶅彲灝戠殑錛屾病鏈夎﹀悎灝辨病鏈夊崗浣滐紝瀵硅薄涔嬮棿鏃犳硶褰㈡垚涓涓暣浣擄紝浠涔堜簨涔熷仛涓嶄簡銆傚叧閿湪浜庤﹀悎瑕佹伆褰擄紝鍦ㄥ疄鐜伴瀹氬姛鑳界殑鍓嶆彁涓嬶紝鑰﹀悎瑕佸敖鍙兘鐨勬澗鏁c傝繖鏍鳳紝緋葷粺鐨勪竴閮ㄥ垎鍙樺寲瀵瑰叾瀹冮儴鍒嗙殑褰卞搷浼氬緢灝戙?/p>
鍑芥暟鎸囬拡鏄В鑰﹀璞″叧緋葷殑鏈浣沖埄鍣ㄣ係ignal(濡俠oost鐨剆ignal鍜実lib涓殑signal)鏈哄埗鏄竴涓吀鍨嬬殑渚嬪瓙錛屼竴涓璞¤嚜韜殑鐘舵佸彲鑳芥槸鍦ㄥ彉鍖栫殑錛堟垨鑰呬細瑙﹀彂涓浜涗簨浠訛級錛岃屽叾瀹冨璞″叧蹇冨畠鐨勫彉鍖栥備竴鏃﹁瀵硅薄鏈夊彉鍖栧彂鐢燂紝鍏跺畠瀵硅薄瑕佹墽琛岀浉搴旂殑鎿嶄綔銆?/p>
濡傛灉璇ュ璞$洿鎺ュ幓璋冪敤鍏跺畠瀵硅薄鐨勫嚱鏁幫紝鍔熻兘鏄畬鎴愪簡錛屼絾瀵硅薄涔嬮棿鐨勮﹀悎澶揣浜嗐傚浣曟妸榪欑鑰﹀悎闄嶅埌鏈浣庡憿錛宻ignal鏈哄埗鏄緢濂界殑鍔炴硶銆傚畠鐨勫師鐞嗗ぇ鑷村涓嬶細鍏跺畠鍏蟲敞璇ュ璞″彉鍖栫殑瀵硅薄涓誨姩娉ㄥ唽涓涓洖璋冨嚱鏁板埌璇ュ璞′腑銆備竴鏃﹁瀵硅薄鏈夊彉鍖栧彂鐢燂紝灝辮皟鐢ㄨ繖浜涘洖璋冨嚱鏁伴氱煡鍏跺畠瀵硅薄銆傚姛鑳藉悓鏍峰疄鐜頒簡錛屼絾瀹冧滑涔嬮棿鐨勮﹀悎搴﹂檷浣庝簡銆?/p>
鍦–璇█涓紝瑕佽В鍐充互涓婅繖浜涢棶棰橈紝涓嶉噰鐢ㄥ嚱鏁版寚閽堬紝灝嗘槸闈炲父鍥伴毦鐨勩傚湪緙栫▼涓紝濡傛灉浣犱粠娌℃湁鎯沖埌鐢ㄥ嚱鏁版寚閽堬紝寰堥毦鎯沖儚浣犳槸涓涓狢璇█楂樻墜銆?/p>
(13)姹備粠x浣嶏紙楂橈級鍒皔浣嶏紙浣庯級闂村叡鏈夊灝戜釜1
public static int FindChessNum(int x, int y, ushort k)
{
int re = 0;
for (int i = y; i <= x; i++)
{
re += ((k >> (i - 1)) & 1);
}
return re;
}
(14)
/*灝?2浣嶆暟鍒嗚В涓?涓?浣嶆暟澶勭悊鍚庡啀鍚堟垚32浣嶆暟榪斿洖*/
DWORD GetDW(DWORD dw)
{
DWORD dwRet=0;
if (dw!=0)
{
BYTE b1=(dw>>24)&0xff,b2=(dw>>16)&0xff,b3=(dw>>8)&0xff,b4=dw&0xff;
//鍒嗗埆澶勭悊 b1,b2,b3,b4
dwRet=b1;
dwRet=(dwRet<<8)+b2;
dwRet=(dwRet<<8)+b3;
dwRet=(dwRet<<8)+b4;
return dwRet;
}
else{
return 0;
}
}
媯嫻嬩竴涓棤絎﹀彿鏁版槸涓嶄負2^n-1(^涓哄箓)錛?nbsp; x&(x+1)
灝嗘渶鍙充晶0浣嶆敼涓?浣嶏細 x | (x+1)
浜岃繘鍒惰ˉ鐮佽繍綆楀叕寮忥細
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//鏃犵鍙穢,y姣旇緝
x<=y: (~x|y)&((x^y)|~(y-x))//鏃犵鍙穢,y姣旇緝
浣跨敤浣嶈繍綆楃殑鏃犲垎鏀唬鐮侊細
璁$畻緇濆鍊?nbsp;
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ;//or: (x+y)^y
}
絎﹀彿鍑芥暟錛歴ign(x) = -1, x<0; 0, x == 0 ; 1, x > 0
int sign(int x)
{
return (x>>31) | (unsigned(-x))>>31 ;//x=-2^31鏃跺け璐?^涓哄箓)
}
涓夊兼瘮杈冿細cmp(x,y) = -1, x<y; 0, x==y; 1, x > y
int cmp( int x, int y )
{
return (x>y)-(x-y) ;
}
doz=x-y, x>=y; 0, x<y
int doz(int x, int y )
{
int d ;
d = x-y ;
return d & ((~(d^((x^y)&(d^x))))>>31) ;
}
int max(int x, int y )
{
int m ;
m = (x-y)>>31 ;
return y & m | x & ~m ;
}
涓嶄嬌鐢ㄧ涓夋柟浜ゆ崲x,y:
1.x ^= y ; y ^= x ; x ^= y ;
2.x = x+y ; y = x-y ; x = x-y ;
3.x = x-y ; y = y+x ; x = y-x ;
4.x = y-x ; x = y-x ; x = x+y ;
鍙屽間氦鎹?x = a, x==b; b, x==a//甯歌緙栫爜涓簒 = x==a ? b :a ;
1.x = a+b-x ;
2.x = a^b^x ;
涓嬭垗鍏ュ埌2鐨刱嬈℃柟鐨勫嶆暟:
1.x & ((-1)<<k)
2.(((unsigned)x)>>k)<<k
涓婅垗鍏ワ細
1. t = (1<<k)-1 ; x = (x+t)&~t ;
2.t = (-1)<<k ; x = (x-t-1)&t ;
浣嶈鏁?緇熻1浣嶇殑鏁伴噺錛?nbsp;
1.
int pop(unsigned x)
{
x = x-((x>>1)&0x55555555) ;
x = (x&0x33333333) + ((x>>2) & 0x33333333 ) ;
x = (x+(x>>4)) & 0x0f0f0f0f ;
x = x + (x>>8) ;
x = x + (x>>16) ;
return x & 0x0000003f ;
}
2.
int pop(unsigned x) {
static char table[256] = { 0,1,1,2, 1,2,2,3, ...., 6,7,7,8 } ;
return table[x&0xff]+table[(x>>8)&0xff]+table[(x>>16)&0xff]+table[(x>>24)] ;
}
濂囧伓鎬ц綆?
x = x ^ ( x>>1 ) ;
x = x ^ ( x>>2 ) ;
x = x ^ ( x>>4 ) ;
x = x ^ ( x>>8 ) ;
x = x ^ ( x>>16 ) ;
緇撴灉涓綅浜巟鏈浣庝綅錛屽鏃犵鍙穢,緇撴灉鐨勭i浣嶆槸鍘熸暟絎琲浣嶅埌鏈宸︿晶浣嶇殑濂囧伓鎬?nbsp;
浣嶅弽杞細
unsigned rev(unsigned x)
{
x = (x & 0x55555555) << 1 | (x>>1) & 0x55555555 ;
x = (x & 0x33333333) << 2 | (x>>2) & 0x33333333 ;
x = (x & 0x0f0f0f0f) << 4 | (x>>4) & 0x0f0f0f0f ;
x = (x<<24) | ((x&0xff00)<<8) | ((x>>8) & 0xff00) | (x>>24) ;
return x ;
}
閫掑浣嶅弽杞悗鐨勬暟錛?nbsp;
unsigned inc_r(unsigned x)
{
unsigned m = 0x80000000 ;
x ^= m ;
if( (int)x >= 0 )
do { m >>= 1 ; x ^= m ; } while( x < m ) ;
return x ;
}
娣烽変綅錛?nbsp;
abcd efgh ijkl mnop ABCD EFGH IJKL MNOP->aAbB cCdD eEfF gGhH iIjJ kKlL mMnN oOpP
unsigned ps(unsigned x)
{
unsigned t ;
t = (x ^ (x>>8)) & 0x0000ff00; x = x ^ t ^ (t<<8) ;
t = (x ^ (x>>4)) & 0x00f000f0; x = x ^ t ^ (t<<4) ;
t = (x ^ (x>>2)) & 0x0c0c0c0c; x = x ^ t ^ (t<<2) ;
t = (x ^ (x>>1)) & 0x22222222; x = x ^ t ^ (t<<1) ;
return x ;
}
浣嶅帇緙╋細
閫夋嫨騫跺彸縐誨瓧x涓搴斾簬鎺╃爜m鐨?浣嶇殑浣?濡傦細compress(abcdefgh,01010101)=0000bdfh
compress_left(x,m)鎿嶄綔涓庢綾諱技錛屼絾緇撴灉浣嶅湪宸﹁竟: bdfh0000.
unsigned compress(unsigned x, unsigned m)
{
unsigned mk, mp, mv, t ;
int i ;
x &= m ;
mk = ~m << 1 ;
for( i = 0 ; i < 5 ; ++i ) {
mp = mk ^ ( mk << 1) ;
mp ^= ( mp << 2 ) ;
mp ^= ( mp << 4 ) ;
mp ^= ( mp << 8 ) ;
mp ^= ( mp << 16 ) ;
mv = mp & m ;
m = m ^ mv | (mv >> (1<<i) ) ;
t = x & mv ;
x = x ^ t | ( t >> ( 1<<i) ) ;
mk = mk & ~mp ;
}
return x ;
}
浣嶇疆鎹細
鐢?2涓?浣嶆暟琛ㄧず浠庢渶浣庝綅寮濮嬬殑浣嶇殑鐩爣浣嶇疆錛岀粨鏋滄槸涓涓?2*5鐨勪綅鐭╅樀錛?nbsp;
灝嗚鐭╅樀娌挎瀵硅綰胯漿緗悗鐢?涓?2浣嶅瓧p[5]瀛樻斁銆?nbsp;
SAG(x,m) = compress_left(x,m) | compress(x,~m) ;
鍑嗗宸ヤ綔錛?nbsp;
void init( unsigned *p ) {
p[1] = SAG( p[1], p[0] ) ;
p[2] = SAG( SAG( p[2], p[0]), p[1] ) ;
p[3] = SAG( SAG( SAG( p[3], p[0] ), p[1]), p[2] ) ;
p[4] = SAG( SAG( SAG( SAG( p[4], p[0] ), p[1]) ,p[2]), p[3] ) ;
}
瀹為檯緗崲錛?nbsp;
int rep( unsigned x ) {
x = SAG(x,p[0]);
x = SAG(x,p[1]);
x = SAG(x,p[2]);
x = SAG(x,p[3]);
x = SAG(x,p[4]);
return x ;
}
浜岃繘鍒剁爜鍒癎RAY鐮佺殑杞崲:
unsigned B2G(unsigned B )
{
return B ^ (B>>1) ;
}
GRAY鐮佸埌浜岃繘鍒剁爜:
unsigned G2B(unsigned G)
{
unsigned B ;
B = G ^ (G>>1) ;
B = G ^ (G>>2) ;
B = G ^ (G>>4) ;
B = G ^ (G>>8) ;
B = G ^ (G>>16) ;
return B ;
}
鎵懼嚭鏈宸?瀛楄妭鐨勪綅緗?
int zbytel( unsigned x )
{
static cahr table[16] = { 4,3,2,2, 1,1,1,1, 0,0,0,0, 0,0,0,0 } ;
unsigned y ;
y = (x&0x7f7f7f7f) + 0x7f7f7f7f ;
y = ~(y|x|0x7f7f7f7f) ;
return table[y*0x00204081 >> 28] ;//涔樻硶鍙敤縐諱綅鍜屽姞瀹屾垚
}
C\C++鏀寔姣旇緝浣庨樁鐨勪綅榪愮畻錛屽湪鏄紬浜虹殕鐭ョ殑浜嗐傛瘡鏈珻\C++鐨勬暀縐戜功閮戒細璇村埌榪欓儴鍒嗙殑鍐呭錛屼笉榪囬兘寰堢畝鐣ワ紝鎴戞兂浼氭湁寰堝浜轟笉鐭ラ亾浣嶈繍綆楃敤鍦ㄤ粈涔堝湴鏂廣傝繖涓笘瀛愬氨綆鐣ヨ璇翠綅榪愮畻鐨勭敤澶勶紝鏇磋繘涓姝ョ殑鐢ㄦ硶瑕佸ぇ瀹惰嚜宸卞幓浣撲細銆傝屼富瑕佽鐨勬槸鎿嶄綔鏍囧織鍊兼柟闈€?/p>
/****************************************/
#define BTI_MSK(bit) (1 << (bit))
#define BIT_SET(x,bit) ((x) |= BTI_MSK (bit))
#define BIT_CLR(x,bit) ((x) &= ~BTI_MSK (bit))
#define BIT_TST(x,bit) ((x) & BTI_MSK (bit))
/****************************************/
鑰冭檻涓涓簨鐗┿佷竴涓郴緇熴佹垨鑰呬竴涓▼搴忓彲鑳戒細鍑虹幇涓縐嶆垨鑰呭嚑縐嶇姸鎬併備負浜嗗湪涓嶅悓鐨勭姸鎬佷笅錛屼綔鍑轟笉鍚岀殑琛屼負錛屼綘鍙互璁劇珛涓浜涙爣蹇楀鹼紝鍐嶆牴鎹爣蹇楀兼潵鍋氬垽鏂傛瘮濡侰++鐨勬枃浠舵祦錛屼綘灝卞彲浠ヨ瀹氫竴浜涙爣蹇楀鹼紝ios::app, ios::ate, ios::binary, ios::in, ios::out, ios::trunc錛屽茍涓斿彲浠ュ皢瀹冪敤|緇勫悎璧鋒潵鍒涘緩涓涓伆褰撶殑鏂囦歡嫻併備綘鍙兘浼氬皢榪欎簺鏍囧織鍊煎畾涔変負bool綾誨瀷錛屼笉榪囪繖鏍瘋鏄緗殑鏍囧織鍊間竴澶氾紝灝變細寰堟氮璐圭┖闂淬?br>
鑰屽亣濡傚畾涔変竴涓暣鍨嬫暟鍊鹼紝unsigned int flags; 鍦ㄧ幇鍦ㄧ殑緋葷粺錛宖lags搴旇鏄?2浣? 鐢?,2,3....32灝嗕綅榪涜緙栧彿錛屾垜浠彲浠ヨ繘琛岃繖鏍風殑鍒ゆ柇, 褰撲綅1鍙?鏃訛紝琛ㄧず鐢ㄨ鏂瑰紡鎵撳紑鏂囦歡錛屽綋浣?鍙?鏃訛紝琛ㄧず鐢ㄥ啓鏂瑰紡鎵撳紑鏂囦歡錛屽綋浣?鍙?鏃訛紝鐢ㄤ簩榪涘埗鏂瑰紡鎵撳紑鏂囦歡....鍥犱負flags鏈?2浣嶏紝灝卞彲浠ヨ緗?2涓笉鍚岀殑鐘舵佸鹼紝涔熺浉褰撲簬32涓猙ool綾誨瀷銆傝繖鏍蜂竴鏂歸潰鐪佷簡絀洪棿, 鍙︿竴鏂歸潰涔熷浜嗕釜濂藉錛屽氨鏄鍓嶉潰鎵璇寸殑錛屽彲浠ュ皢鏍囧織鍊肩粍鍚堣搗鏉ャ?br>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
濂藉暒錛屼笂闈㈡湁鐐逛笉娓呬笉妤氱殑銆備笅闈㈢湅鐪嬪埌搴曟庝箞鎿嶄綔榪欎簺鏍囧織鍊箋?br>璁炬兂C++鐨勭被ios榪欐牱瀹氫箟, 鍏跺疄娌℃湁榪欎釜綾伙紝鍙湁ios_basic綾伙紝typedef basic_ios<char> ios;
class ios
{
public:
enum { app = 0x0001, ate = 0x0002, binary = 0x0004,
in = 0x0008, out = 0x0010, trunc = 0x0020 };
....
private:
unsigned int flags;
};
娉ㄦ剰涓婇潰enum璇彞涓紝姣忎竴涓暟鍊煎彧鏈?浣嶆槸1錛屽叾浣欐槸0錛岃繖涓緢閲嶈錛屼綘鍙互灝嗗畠鍖栨垚2榪涘埗鐪嬬湅銆?br>
鐜板湪灝唂lags鐩稿簲鐨勪綅璁劇疆涓?, 鍙互榪欐牱鍋?nbsp;flags |= app銆傝繖涓瓑浜巉lags = flags | app, 涓轟粈涔堝憿? app鍙湁1浣嶆槸1錛屽叾浣欐槸0錛屽洜涓? | 1 = 0錛?nbsp;0 | 0 = 0錛?nbsp;榪欐牱0瀵瑰簲鐨勪綅鏄笉鍙樼殑銆傝? | 1 = 1, 1 | 0 = 1, 1瀵瑰簲鐨勪綅涓嶈鍘熸潵鏄粈涔堢姸鎬侊紝閮戒竴瀹氫負1銆傚鏋滄兂瑕佸皢鍑犱釜浣嶉兘璁劇疆涓?錛屽彲浠ヨ繖鏍峰仛 flags |= (app | ate | binary)銆傚洜涓烘瘡涓猠num甯告暟鍚勬湁涓浣嶄負1, 涓庤繍綆椾箣鍚庡氨鏈?浣嶄負1錛屽氨濡備笂闈㈢殑鍒嗘瀽錛屽氨鍙互灝嗛偅3浣嶉兘璁劇疆涓?, 鍏朵綑浣嶄笉鍙樸傝繖涓氨鏄爣蹇楀彲浠ョ粍鍚堣搗鏉ョ敤鐨勫師鍥犮備篃鍙互鐢?緇勫悎璧鋒潵錛屽師鍥犲湪浜?涓嬮潰鐨勬暟瀛楁槸2榪涘埗)0001 + 0010 + 0100 = 0111 璺熶笌榪愮畻緇撴灉涓鏍楓備笉榪囦笉鎻愬$敤+, 鑰冭檻(app | ate | binary)瑕佹槸鎴戜笉灝忓績鍐欏浜嗕釜鏍囧織鍊鹼紝(app | ate | ate | binary)緇撴灉榪樻槸姝g‘鐨勶紝濡傛灉鐢?鐨勮瘽錛屽氨浼氫駭鐢熻繘浣嶏紝緇撴灉灝變細閿欒銆傞氬父鎴戜滑涓嶇煡閬撳師鍏堝凡緇忕粍鍚堜簡澶氬皯涓爣蹇楀間簡錛岀敤鎴栬繍綆椾細瀹夊叏銆?br>
鐜板湪灝唂lags瀵瑰簲鐨勪綅璁劇疆涓?, 鍙互榪欐牱鍋?nbsp;flags &= ~app銆傜浉褰撲簬 flags = flags & (~app). app鍙栧弽涔嬪悗錛屽彧鏈?浣嶆槸0錛屽叾浣欐槸1錛屽仛涓庤繍綆椾箣鍚庯紝1瀵瑰簲鐨勪綅騫朵笉浼氭敼鍙橈紝0瀵瑰簲鐨勪負涓嶇鍘熸潵鏄?鏄?錛岄兘鑲畾涓?錛岃繖鏍峰氨灝嗗搴旂殑浣嶈緗簡0銆傚悓鏍峰悓鏃惰緗嚑涓爣蹇椾綅鍙互榪欐牱鍋氾紝flags &= ~(app | ate | binary)銆?br>
鐜板湪灝唂lags瀵瑰簲鐨勪綅錛屽鏋滄槸1灝卞彉鎴?錛屽鏋滄槸0灝卞彉鎴?錛屽彲浠ヨ繖鏍峰仛 flags ^= app銆傚悓鏃惰緗嚑涓爣蹇椾綅鍙互鍐欐垚 flags ^= (app | ate | binary)銆備笉鍐嶅仛鍒嗘瀽浜嗭紝涓嶇劧灝卞お緗楀棪浜嗐備笉榪囦篃緇欏ぇ瀹朵竴涓緥瀛愶紝浣犳煡鏌scii琛紝浼氬彂鐜板搴旂殑澶у皬鍐欏瓧姣嶆槸鐩稿樊鍊掓暟絎?浣嶏紝鍙互鐢ㄨ繖鏍風殑鍑芥暟緇熶竴鐨勫皢澶у啓鍙樻垚灝忓啓錛屽皬鍐欏彉鎴愬ぇ鍐欍?br>void xchgUppLow(string& letters)
{
const unsigned int mask = (1<<5);
for (size_t i=0; i<letters.length(); i++)
letters[i] ^= mask;
}
鍓嶆彁鏄緭鍏ョ殑string涓瀹氳鍏ㄦ槸瀛楁瘝, 鑰岃鎯蟲槸鎿嶄綔瀛楁瘝錛屽彲浠ュ湪鍘熸潵鍩虹涓婂姞涓垽鏂?br>
濂藉暒錛屼笂闈㈠凡緇忓彲浠ヨ緗甪lags鐨勫搴斾綅鍊間簡錛岃鏄垽鏂憿錛熷彲浠ヨ繖鏍峰啓 if (flags & app) 榪欐牱鍙互鍒ゆ柇瀵瑰簲鐨勪綅鍊兼槸鍚︿負1, 鍥犱負C\C++璇█涓潪0灝辯湡銆俛pp鍙湁涓浣嶆槸1錛屽叾浣欐槸0錛屽鏋? flags鐨勫搴斾綅涔熸槸0錛屽湪涓庢搷浣滀笅灝卞緱鍒扮粨鏋?錛屽弽涔嬮潪0錛岃繖鏍峰氨鍙互鍒ゆ柇鏍囧織浣嶄簡銆?br>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
涓婇潰鍏充簬鏍囧織鍊肩殑鎿嶄綔灝變粙緇嶅畬姣曘傚叾瀹炲湪C++涓凡緇忔湁浜嗕釜bitset浜嗭紝娌℃湁蹇呰鍘昏嚜宸辮繘琛屼綆闃剁殑浣嶈繍綆楋紝涓婇潰鐨勫洓涓搷浣滃湪bitset涓垎鍒彨鍋歴et, reset, flip, test銆備笉榪囧湪C涓紝榪欐牱鐨勪唬鐮佽繕寰堝父瑙? 鍙嶆鐭ラ亾澶氱偣涔熸病鏈夊潖澶勩?br>
鐢?nbsp;windows API 緙栫▼錛屼綘涔熺粡甯鎬細紕板埌榪欐牱鐨勬爣蹇楀鹼紝瑕佷簰鐩哥粍鍚堬紝鍙互鐢▅, 涔熷彲浠ョ敤+(鍙槸寤鴻鐢▅錛岀悊鐢變笂闈㈣浜?. 瀹冪殑鏍囧織鍊間篃鏄繖鏍峰畾涔夌殑錛屼笉榪囩敤#define
#define WS_BORDER 0x0001
#define WS_CAPTION 0x0002
......
褰撳垵鎴戝氨鏄兂涓嶆槑鐧戒負浠涔堝彲浠ョ敤|鎴栬呯敤+鏉ョ粍鍚堬紝鐜板湪鐭ラ亾浜嗐?br>
(娉細涓婇潰鍑虹幇鐨勬暟瀛楁槸鎴戣嚜宸變綔鐨勶紝鍒板簳瀹為檯鎬庝箞瀹氫箟鍏跺疄娌℃湁鍏崇郴錛屽彧瑕佷繚璇佸彧鏈変竴浣嶆槸1錛屽叾浣欐槸0灝卞彲浠ョ殑浜? 鍥犱負緙栫▼鐨勬椂鍊欑敤鐨勬槸甯擱噺鍊鹼紝娌℃湁浜鴻繖鏍風鍘葷洿鎺ョ敤鏁板肩殑)
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
鍏跺疄錛屼綅榪愮畻榪樻湁寰堝鐢ㄥ銆傛瘮濡傜Щ浣嶇浉褰撲簬涔橀櫎2鐨勫箓鏁?涓嶈繃閫氬父緙栬瘧鍣ㄤ篃灝嗕箻闄?鐨勫箓鏁頒紭鍖栨垚姹囩紪鐨勭Щ浣嶆寚浠わ紝鎵浠ユ病鏈夊繀瑕佷笉瑕佽繖鏍峰崠寮勪簡銆傛眹緙栫殑縐諱綅鎸囦護鏈変袱緇勶紝鍒嗗埆閽堝鏈夌鍙峰拰鏃犵鍙風殑, 鎴戠寽鎯沖湪C\C++鐨勫悓涓縐諱綅榪愮畻閽堝鏈夌鍙鋒暣鏁板拰鏃犵鍙鋒暣鏁扮殑涓嶅悓錛屼細鏍規嵁鎯呭喌緙栬瘧鎴愪笉鍚岀殑姹囩紪縐諱綅鎸囦護錛屼笉榪囨病鏈夊幓璇佸疄), 鍏跺疄縐諱綅鏇寸敤寰楀鐨勫湴鏂規槸鍘繪瀯閫犱竴涓帺鐮? 姣斿涓婇潰鐨刴ask = (1<<5);
榪樻湁&榪愮畻錛屾湁鏃跺欏彲浠ョ敤鏉ユ眰浣欐暟銆傛瘮濡?nbsp;value & (1<<4 - 1) 榪欑浉褰撲簬灝唙alue鐨勯珮浣嶅叏鍙樻垚0浜嗭紝鏁堟灉絳変簬 value % 8.
榪樻湁鍊煎緱涓鎻愮殑鏄痎榪愮畻錛屽畠鏈変釜寰堢壒孌婄殑鎬ц川銆傛瘮濡?nbsp;A ^= B, 鍙樻垚鍙︿竴涓暟錛岃窡鐫鍐嶆墽琛孉 ^= B錛屽張鍙樺洖鍘熸潵鐨勬暟浜嗭紝涓嶄俊浣犲彲浠ュ垪鐪熷艱〃鎴栬呭寲綆閫昏緫寮忕湅鐪嬨傚氨鍥犱負榪欎釜鎬ц川錛宆鏈夊緢澶氱敤閫斻傛瘮濡傚姞瀵嗭紝浣犲皢鍘熸枃鐪嬫垚A, 鐢ㄥ悓涓涓狟寮傛垨涓嬈★紝灝辯浉褰撲簬鍔犲瘑錛岃窡鐫鍦ㄧ敤B寮傛垨涓嬈★紝鐩稿綋浜庤В瀵嗐備笉榪囪繖鏍鋒槸寰堝鏄撶牬瑙e氨鏄簡銆傝鏄竴涓狟涓嶅錛岃繕鍙互鍔犱釜C, 姣斿A ^= B, A ^= C, A ^= C, A ^= B, 鎭㈠鍘熺姸銆?br>
涓嬮潰涓涓皬紼嬪簭錛岀敤寮傛垨浜ゆ崲涓や釜鏁板瓧銆?br>int x = 3;
int y = 4;
x ^= y;
y ^= x;
x ^= y;
鍏跺疄浣曟浜ゆ崲鏁板瓧錛岃繛浜ゆ崲瀵硅薄涔熷彲浠ョ殑
template <typename T>
void swap(T& obj1, T& obj2)
{
const int sizeOfObj = sizeof(T);
char* pt1 = (char*)&obj1;
char* pt2 = (char*)&obj2;
for (size_t i=0; i<sizeOfObj; i++)
{
pt1[i] ^= pt2[i];
pt2[i] ^= pt1[i];
pt1[i] ^= pt2[i];
}
}
榪樻湁寮傛垨鎿嶄綔榪樺彲浠ョ敤鍦ㄥ浘璞$殑鍏夋爡鎿嶄綔銆傛垜浠煡閬擄紝棰滆壊涔熸槸鐢ㄤ簩榪涘埗鏉ヨ〃紺虹殑錛屽棰滆壊榪涜涓嶅悓鐨勪綅榪愮畻錛屽氨鍙互寰楀埌涓嶅悓鐨勫厜鏍呫傚洜涓哄紓鎴栫殑鐗規畩鎬ц川錛屾垜浠敤寮傛垨鎿嶄綔鐨勫厜鏍呯敾浜嗗壇鍥撅紝璺熺潃鍐嶅湪鍘熸潵鐨勫湴鏂圭敾涓嬈★紝閭e壇鍥懼氨鍒烽櫎浜嗐傝繖鏍峰彲浠ョ敤鏉ユ樉紺哄姩鐢昏屼笉鐢ㄤ繚瀛樺師鏉ョ殑鐢誨儚淇℃伅銆備互鍓嶆垜鍐欒繃涓弻浜虹殑璐铔囷紝灝辯敤浜嗗紓鎴栧厜鏍呫傚洜涓鴻儗鏅壊鏄櫧鑹茬殑錛屼篃灝辨槸鍏?錛屼綔A ^ 1 = A, 鎵浠ョ敤鐢誨埛鐢諱竴嬈℃槸鐢諱簡璁懼畾鐨勯鑹詫紝鍐嶇敾涓嬈″氨鎭㈠銆傛渶鏈夎叮鐨勬槸涓よ泧鐩鎬氦鐨勬椂鍊欙紝棰滆壊涔熶細浣滃紓鎴栧彔鍔狅紝浜х敓涓縐嶆柊鐨勯鑹蹭簡錛岀寮鐨勬椂鍊欎篃浼氳嚜鍔ㄦ仮澶嶃?br>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
濂藉暒錛屽闀夸簡錛屽氨鍋滄鍚с傚湪鏈鍚庡啀緇欏ぇ瀹朵竴孌典唬鐮侊紝鏄敤鏉ョ湅鐪嬪璞″湪鍐呭瓨涓殑浣嶅肩殑銆傚彲浠ョ湅鐪嬨?br>string bitsOfUChar(unsigned char c)
{
const int numOfBitsInUChar = 8;
unsigned int mask = (1<<7);
string result(8, '0');
for (size_t i=0; i<numOfBitsInUChar; i++)
{
if ( mask & c)
result[i] = '1';
mask >>= 1;
}
return result;
}
template <typename T>
string bitsInMemory(const T& obj)
{
int sizeOfObj = sizeof(obj);
unsigned char* pt = (unsigned char*)&obj;
string result;
for (size_t i=0; i<sizeOfObj; i++)
{
result += bitsOfUChar(pt[i]);
result += ' ';
}
return result;
}
姣斿bitsInMemory(12)錛屼細杈撳嚭00001100 00000000 00000000 00000000, 鎴戝氨鐭ラ亾鎴戣嚜宸辯殑鏈哄櫒鏄皬灝鵑『搴忕殑浜嗐?br>