ผมพยายามค้นหาแล้วแต่ก็ยังไม่เจอครับ คือ จะหา Function ที่ใช้แปลง เลข ฐาน 16 เป็น ฐาน 2 หน่ะครับ "
เช่น "D0" แปลงเป็น "11010000" อะไรประมาณนี้หน่ะครับ หรือว่า จะต้องเขียน function เองครับ
ขอบคุณมากๆครับ
ถามเรื่องคำสั่งใน VB ครับ
เริ่มโดย wengweng, May 08 2007 07:31 AM
มี 5 โพสต์ตอบกลับกระทู้นี้
#1
โพสต์เมื่อ 08 May 2007 - 07:31:11 AM
#2
โพสต์เมื่อ 08 May 2007 - 11:40:40 PM
น่าสนุก c++ ขอแจม
ขออภัยที่ไม่ได้ช่วยอะไร แต่ผมเห็นคำถามแล้วปิ๊งไอเดีย
ที่ผมสนใจก็คือ เอ เขียนอย่างไร ให้มันทำงานเร็วที่สุด
จากที่ลองหลายๆ แบบ แล้วดูโค้ด asm หลังจากที่คอมไพล์เลอร์มันคอมไพล์เป็น exe แล้ว
ปรากฏว่า หลายๆ จุดไม่ต่างกันเลย คอมไพล์เลอร์มันฉลาดพอ ที่จะแปลงโค้ดให้ออกมาดี
แม้ว่าเราจะเขียนโค้ดที่ไม่ใช่รูปแบบที่ คอมฯ เข้าใจที่สุด
ตรงนี้จึงเป็นข้อยืนยันอย่างนึง ที่ ระดับโปร เขาแนะนำให้เขียนโค้ด
โดยคิดว่าให้คนอ่าน ไม่ใช่ให้คอมฯ อ่าน เช่น
หลายคนอาจสงสัย อะไรของมัน
โค้ดตรงนี้ผมต้องการหาจำนวนตัวอักษรที่ใช้แทนค่า 0 กะ 1 ของเลขฐานสอง
เนื่องจาก sizeof() คืนค่าขนาดของตัวแปร เป็น จำนวน ไบต์ และ 1 ไบต์ เท่ากัน 8 บิต หรือ 8 ตัวอักษรนั่นเอง
คนที่เริ่มเขียนโปรแกรม มักจะเขียนอย่างนี้
พวกกระแดะ(เหมือนผม) จะเขียนแบบที่ยกมา
แบบทั่วไปที่คนเขียน และ ระดับโปรแนะนำ คือ
แล้วมันต่างกันอย่างไร
นั่นแหละครับที่ผมสงสัย(ที่จริงผมหายสังสัยนานละ เพราะอ่านหนังสือเจอ แต่ดูเหมือนจะยังไม่ได้พิสูจน์)
ผลที่ออกมาก็คือ ขึ้นอยู่กับประเภทของตัวแปรครับ
ถ้าเป็น ประเภท user defined type ควรเขียนแบบที่โปรแนะนำนั่นแหละครับ หรือจะเอาแบบกระแดะก็ได้
(user defined type ก็เช่น class ที่เราสร้างเอง)
แต่ถ้าเป็น ประเภทพื้นฐาน พวก char,short หรือ int ไม่ต่างกันครับ
คอมไพล์เลอร์ มันฉลาดพอที่จะแปลงโค้ดออกมาดี ซึ่งทั้งสามแบบ ผมลองแล้ว ก็ได้โค้ดออกมาเหมือนกันคือ
จะเห็นว่าแบบกระแดะ(ขออภัยที่ไม่สุภาพ) คือเขียนให้คอมฯ อ่าน และคอมไพล์เลอร์ก็คงชอบ ไม่ต้องคิดมาก
แต่อย่างที่บอก เขียนแบบให้คนอ่านหน่ะดีแล้ว ให้คอมไพล์เลอร์มันปวดหัวแทนเราดีกว่า(เหนื่อยทำไมเมื่อได้ผลเหมือนกัน)
แต่ก็มีบางกรณีนะครับ ที่คอมไพล์เลอร์ โง่กินเหมือนกัน
แทนที่จะแปลแบบนึง มันก็แปลอีกแบบนึง ตรงนี้แหละครับ ที่เขาวัดความสามารถของคอมไพล์เลอร์
เขาว่ากันว่า ของ borland ฉลาดกว่าของ ms
ผมก็พึ่งคิดได้ไม่กี่วันมานี่เอง
คืออยากเอา c++ builder มาลองเหมือนกัน แต่หาที่โหลด(ในไทย)ยังไม่เจอ
อ้อที่พูดมา มันเกี่ยวกับคุณสมบัติของ constructor กะ operator overloading ของ c++ นะครับ
ลักษณะเด่นอีกอย่างนึงของ c++ ก็คือ template ดังตัวอย่างโค้ดที่ยกมา
มันช่างทำอะไรๆ ให้ง่ายขึ้นตังเยอะ แถมมีประสิทธิภาพด้วย
(ตรงนี้เป็นโฆษณาชวนเชื่อ ให้มาสนใจ c++ โปรดใช้วิจารณญาณในการอ่าน )
ขอบคุณที่ให้แจม ไปหละ ซะแว้บๆๆ แวบบบบบบ
template<class T>
char* HexDigit2BinStr(char* pBuf,int nBufSize,T hex)
{
int nChar(sizeof(hex));
nChar<<=3;
assert(nChar<nBufSize);
char* pc(&pBuf[nChar]);
*pc='\0';
--pc;
T tmp=hex;
for(int i=0;i<nChar;i++)
{
*pc=(tmp&1)?'1':'0';
tmp>>=1;
--pc;
}
return pBuf;
}
char* HexDigit2BinStr(char* pBuf,int nBufSize,T hex)
{
int nChar(sizeof(hex));
nChar<<=3;
assert(nChar<nBufSize);
char* pc(&pBuf[nChar]);
*pc='\0';
--pc;
T tmp=hex;
for(int i=0;i<nChar;i++)
{
*pc=(tmp&1)?'1':'0';
tmp>>=1;
--pc;
}
return pBuf;
}
ขออภัยที่ไม่ได้ช่วยอะไร แต่ผมเห็นคำถามแล้วปิ๊งไอเดีย
ที่ผมสนใจก็คือ เอ เขียนอย่างไร ให้มันทำงานเร็วที่สุด
จากที่ลองหลายๆ แบบ แล้วดูโค้ด asm หลังจากที่คอมไพล์เลอร์มันคอมไพล์เป็น exe แล้ว
ปรากฏว่า หลายๆ จุดไม่ต่างกันเลย คอมไพล์เลอร์มันฉลาดพอ ที่จะแปลงโค้ดให้ออกมาดี
แม้ว่าเราจะเขียนโค้ดที่ไม่ใช่รูปแบบที่ คอมฯ เข้าใจที่สุด
ตรงนี้จึงเป็นข้อยืนยันอย่างนึง ที่ ระดับโปร เขาแนะนำให้เขียนโค้ด
โดยคิดว่าให้คนอ่าน ไม่ใช่ให้คอมฯ อ่าน เช่น
nChar<<=3;
หลายคนอาจสงสัย อะไรของมัน
โค้ดตรงนี้ผมต้องการหาจำนวนตัวอักษรที่ใช้แทนค่า 0 กะ 1 ของเลขฐานสอง
เนื่องจาก sizeof() คืนค่าขนาดของตัวแปร เป็น จำนวน ไบต์ และ 1 ไบต์ เท่ากัน 8 บิต หรือ 8 ตัวอักษรนั่นเอง
คนที่เริ่มเขียนโปรแกรม มักจะเขียนอย่างนี้
nChar=nChar*8;
พวกกระแดะ(เหมือนผม) จะเขียนแบบที่ยกมา
แบบทั่วไปที่คนเขียน และ ระดับโปรแนะนำ คือ
nChar*=8;
แล้วมันต่างกันอย่างไร
นั่นแหละครับที่ผมสงสัย(ที่จริงผมหายสังสัยนานละ เพราะอ่านหนังสือเจอ แต่ดูเหมือนจะยังไม่ได้พิสูจน์)
ผลที่ออกมาก็คือ ขึ้นอยู่กับประเภทของตัวแปรครับ
ถ้าเป็น ประเภท user defined type ควรเขียนแบบที่โปรแนะนำนั่นแหละครับ หรือจะเอาแบบกระแดะก็ได้
(user defined type ก็เช่น class ที่เราสร้างเอง)
แต่ถ้าเป็น ประเภทพื้นฐาน พวก char,short หรือ int ไม่ต่างกันครับ
คอมไพล์เลอร์ มันฉลาดพอที่จะแปลงโค้ดออกมาดี ซึ่งทั้งสามแบบ ผมลองแล้ว ก็ได้โค้ดออกมาเหมือนกันคือ
mov eax,dword ptr [nChar]
shl eax,3
mov dword ptr [nChar],eax
shl eax,3
mov dword ptr [nChar],eax
จะเห็นว่าแบบกระแดะ(ขออภัยที่ไม่สุภาพ) คือเขียนให้คอมฯ อ่าน และคอมไพล์เลอร์ก็คงชอบ ไม่ต้องคิดมาก
แต่อย่างที่บอก เขียนแบบให้คนอ่านหน่ะดีแล้ว ให้คอมไพล์เลอร์มันปวดหัวแทนเราดีกว่า(เหนื่อยทำไมเมื่อได้ผลเหมือนกัน)
แต่ก็มีบางกรณีนะครับ ที่คอมไพล์เลอร์ โง่กินเหมือนกัน
แทนที่จะแปลแบบนึง มันก็แปลอีกแบบนึง ตรงนี้แหละครับ ที่เขาวัดความสามารถของคอมไพล์เลอร์
เขาว่ากันว่า ของ borland ฉลาดกว่าของ ms
ผมก็พึ่งคิดได้ไม่กี่วันมานี่เอง
คืออยากเอา c++ builder มาลองเหมือนกัน แต่หาที่โหลด(ในไทย)ยังไม่เจอ
อ้อที่พูดมา มันเกี่ยวกับคุณสมบัติของ constructor กะ operator overloading ของ c++ นะครับ
ลักษณะเด่นอีกอย่างนึงของ c++ ก็คือ template ดังตัวอย่างโค้ดที่ยกมา
มันช่างทำอะไรๆ ให้ง่ายขึ้นตังเยอะ แถมมีประสิทธิภาพด้วย
(ตรงนี้เป็นโฆษณาชวนเชื่อ ให้มาสนใจ c++ โปรดใช้วิจารณญาณในการอ่าน )
ขอบคุณที่ให้แจม ไปหละ ซะแว้บๆๆ แวบบบบบบ
#5
โพสต์เมื่อ 10 April 2008 - 09:11:22 AM
VB นะครับ Asc2Hex
Public Function SP_Asc2Hex(ByVal strAscii As String) As String
Dim i As Integer
Dim strHexTmp As String
For i = 1 To Len(strAscii)
strHexTmp = strHexTmp & Right$("00" & Hex(Asc(Mid$(strAscii, i, 1))), 2)
Next
SP_Asc2Hex = strHexTmp
End Function
Public Function SP_Asc2Hex(ByVal strAscii As String) As String
Dim i As Integer
Dim strHexTmp As String
For i = 1 To Len(strAscii)
strHexTmp = strHexTmp & Right$("00" & Hex(Asc(Mid$(strAscii, i, 1))), 2)
Next
SP_Asc2Hex = strHexTmp
End Function
QUOTE
Asc2Hex
#6
โพสต์เมื่อ 10 April 2008 - 09:23:31 AM
Public Function SP_Dec2Hex(ByVal Num As Long, ByVal Size As Integer) As String
On Error GoTo OnError
SP_Dec2Hex = Right$(String$(Size, "0") & Hex(Num), Size)
Exit Function
OnError:
Call SP_eErr(Err)
End Function
On Error GoTo OnError
SP_Dec2Hex = Right$(String$(Size, "0") & Hex(Num), Size)
Exit Function
OnError:
Call SP_eErr(Err)
End Function
2 สมาชิกกำลังอ่านกระทู้นี้
0 สมาชิก, 2 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว