PDA

View Full Version : خواندن یک متغییر



reza1373
پنج شنبه 03 اسفند 1391, 19:04 عصر
سلام
چگونه میشه فهمید مثلا بیت 12 یه متغییر از نوع لونگ چنده صفره یا یک میشه؟

reza1373
پنج شنبه 03 اسفند 1391, 19:35 عصر
dim a as long
if a.12=1 then exit do
من تو یه زبون دیگه این کار رو میکردم ولی تو vb نمیدونم چیکار کنم:اشتباه:

reza1373
پنج شنبه 03 اسفند 1391, 19:48 عصر
یعنی کسی نیست جواب من رو بده ؟ تو رو خدا لازمش دارم

the king
پنج شنبه 03 اسفند 1391, 19:53 عصر
سلام
چگونه میشه فهمید مثلا بیت 12 یه متغییر از نوع لونگ چنده صفره یا یک میشه؟

دقت کنید که بیت شماره 12 با بیت 12 ام فرق داره، شماره بیت ها از 0 شروع میشه، پس بیت شماره 12 در واقع بیت سیزدهم ئه.
بیت 12 ام بیت شماره 11 است و ارزش اش معادل 2 به توان 11 است :


Dim n As Long = 12345
Dim b As Integer = Math.Sign(n And (2 ^ 11))
MessageBox.Show(b)

reza1373
پنج شنبه 03 اسفند 1391, 19:55 عصر
ممنون فقط
چطور میشه عوضش کرد؟
مثلا یه بیتشو یک کنم چطوری میشه

reza1373
پنج شنبه 03 اسفند 1391, 21:12 عصر
دوستان کمککککککککککک

the king
پنج شنبه 03 اسفند 1391, 21:35 عصر
ممنون فقط
چطور میشه عوضش کرد؟
مثلا یه بیتشو یک کنم چطوری میشه
از AND و OR یا XOR استفاده میشه.
برای 0 یا 1 کردن یک بیت :

Private Sub SetBit(ByRef value As Long, ByVal bit As Integer, ByVal bitValue As Boolean)
If bitValue Then
value = value Or (2 ^ bit)
Else
value = value And (Long.MaxValue Xor (2 ^ bit))
End If
End Sub


به عنوان مثال، یک کردن بیت شماره 11 در عدد n

Dim n As Long = 12345
SetBit(n, 11, True)


صفر کردن بیت شماره 11 در عدد n

Dim n As Long = 12345
SetBit(n, 11, False)

reza1373
پنج شنبه 03 اسفند 1391, 21:37 عصر
مهندس ارور میده

فقط همین تنها بسه؟
SetBit(n, 11, True)
یا اون ساب رو هم میخواد؟

the king
پنج شنبه 03 اسفند 1391, 21:40 عصر
مهندس ارور میده

فقط همین تنها بسه؟
SetBit(n, 11, True)
یا اون ساب رو هم میخواد؟

خوب معلومه که می خواد، چون صفر و یک کردن شیوه متفاوتی داشت اون روتین رو نوشتم که کار تون ساده بشه.

reza1373
پنج شنبه 03 اسفند 1391, 22:08 عصر
میشه یه ذره دستوراتو توضیح بدید ممنون میشم
میخوام مثلا بگم بیت 12 ام A برابر بیت 12 B بشه باید چطوری بگم

reza1373
پنج شنبه 03 اسفند 1391, 22:16 عصر
اینجوری درسته؟
SetBit(b, 12, Math.Sign(a And (2 ^ 11)))

the king
پنج شنبه 03 اسفند 1391, 22:25 عصر
میشه یه ذره دستوراتو توضیح بدید ممنون میشم

اصول مقدماتی محاسبات باینری ئه :

ارزش بیت شماره n در یک عدد باینری برابر است با 2 به توان n

وقتی عددی با عدد دیگری AND می شود، فقط زمانی بیت های متناظر 1 می شوند که هر دو 1 باشند، وگرنه 0 خواهند شد.
از این خاصیت AND برای 0 کردن بیت ها استفاده می شود.
فرضا اگر عدد x را با عدد 11111101 AND کنیم، بیت دوم اش 0 خواهد شد و بقیه بیت ها تغییری نخواهند کرد.

وقتی عددی با عدد دیگری OR می شود، فقط زمانی بیت های متناظر 0 می شوند که هر دو 0 باشند، وگرنه 1 خواهند شد.
از این خاصیت OR برای 1 کردن بیت ها استفاده می شود.
فرضا اگر عدد x را با عدد 00000010 OR کنیم، بیت دوم اش 1 خواهد شد و بقیه بیت ها تغییری نخواهند کرد.

وقتی عددی را با عدد دیگری XOR کنیم، بیت های متناظری که یکسان اند 0 خواهند شد و بیت های متناظری که با هم فرق دارند 1 خواهند شد.
از این خاصیت XOR برای تغییر دادن مقدار بیت ها استفاده می شود.
فرضا اگر عدد x را با عدد 00000010 XOR کنیم، بیت دوم اش تغییر خواهد کرد، اگر 0 بود 1 می شود و اگر 1 بود 0 می شود. بقیه بیت ها تغییری نخواهند کرد.

ما برای 1 کردن بیت شماره n ام، باید آنرا با عددی OR کنیم که بیت n اش 1 است و بقیه 0 اند. این عدد همان 2 به توان n است.
ما برای 0 کردن بیت شماره n ام، باید آنرا با عددی AND کنیم که بیت n اش 0 است و بقیه 1 اند. این عدد را از XOR کردن عددی که همه
بیت هایش 1 است (Long.MaxValue) و عدد 2 به توان n بدست می آوریم.

the king
پنج شنبه 03 اسفند 1391, 22:30 عصر
اینجوری درسته؟
SetBit(b, 12, Math.Sign(a And (2 ^ 11)))

بیت شماره 12 بیت 13 ام ئه، اگر اون 12 و 11 شما رو به اشتباه می اندازه، برای خوندن مقدار بیت شماره n از GetBit استفاده کنید :

Private Function GetBit(ByRef value As Long, ByVal bit As Integer) As Integer
Return Math.Sign(value And (2 ^ bit))
End Function


بیت 12 ام همیشه بیت شماره 11 است :

SetBit(b, 11, GetBit(a, 11))

reza1373
پنج شنبه 03 اسفند 1391, 22:54 عصر
به نظرتون مشکل کجایه یه ارور میده به خطی که مشخص کردم



Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim bmp As Bitmap
bmp = New Bitmap(PictureBox1.Image)
Dim color As Color, r As Byte, g As Byte, b As Byte, x As Long, y As Long, out As Long
x = 0
y = 1
Do
color = bmp.GetPixel(x, y)
x = x + 1
If x = 240 Then
x = 0
y = y + 1
End If
If y = 320 Then Exit Sub
b = color.B
SetBit(out, 0, Math.Sign(b And (2 ^ 1)))
SetBit(out, 1, Math.Sign(b And (2 ^ 2)))
SetBit(out, 2, Math.Sign(b And (2 ^ 3)))
SetBit(out, 3, Math.Sign(b And (2 ^ 4)))
SetBit(out, 4, Math.Sign(b And (2 ^ 5)))

g = color.G
SetBit(out, 5, Math.Sign(g And (2 ^ 1)))
SetBit(out, 6, Math.Sign(g And (2 ^ 2)))
SetBit(out, 7, Math.Sign(g And (2 ^ 3)))
SetBit(out, 8, Math.Sign(g And (2 ^ 4)))
SetBit(out, 9, Math.Sign(g And (2 ^ 5)))
SetBit(out, 10, Math.Sign(g And (2 ^ 6)))
r = color.R
SetBit(out, 11, Math.Sign(r And (2 ^ 1)))
SetBit(out, 12, Math.Sign(r And (2 ^ 2)))
SetBit(out, 13, Math.Sign(r And (2 ^ 3)))
SetBit(out, 14, Math.Sign(r And (2 ^ 4)))
SetBit(out, 15, Math.Sign(r And (2 ^ 5)))




SerialPort1.WriteLine(out.ToString() + Chr(13)) '<<<<<<<<<<<<<<<<<<-------------------
For a = 0 To 80000
Next
Loop
End Sub