PDA

View Full Version : نحوه استفاده از >> چطوری هست؟



vb.net.33
شنبه 05 آذر 1390, 15:56 عصر
سلام من این کد رو نوشتم . ولی نمی دونم >> چکار انجام میده؟


Dim m As Integer = 59
m = m << 1
Me.Text = m

Hybrid
یک شنبه 06 آذر 1390, 13:14 عصر
سلام دوست عزیزم ،باید در نظر بگیری که دوطرف عملگر(<< یا >> ) باید اعداد صحیح باشند و خروجیشون اینجوری محاسبه میشه:

وقتی مینویسی x<<y خروجیش میشه x ضرب در 2 به توان y ...

وقتی مینویسی x>>y خروجیش میشه x تقسیم بر 2 به توان y...


موفق باشید...

vb.net.33
یک شنبه 06 آذر 1390, 13:45 عصر
سلام دوست عزیزم ،باید در نظر بگیری که دوطرف عملگر(<< یا >> ) باید اعداد صحیح باشند و خروجیشون اینجوری محاسبه میشه:

وقتی مینویسی x<<y خروجیش میشه x ضرب در 2 به توان y ...

وقتی مینویسی x>>y خروجیش میشه x تقسیم بر 2 به توان y...


موفق باشید...


خوب دلیل این کد نویسی چی بوده؟!!!

مگه اگه اینطوری می نوشتیم چی می شد که این علائم رو طراحی کردن.مثلا بجای x<<y بنویسیم x*2^y

mehdi.mousavi
یک شنبه 06 آذر 1390, 17:16 عصر
سلام.
کدی که شما نوشته اید به این معنی است که "m رو یک بیت به سمت چپ Shift بده" و البته میشد بدین شکل نوشت:

Dim m As Integer = 59
m <<= 1

کد فوق، معادل کد زیر هستش:

Dim m As Integer = 59
m = m << 1


موفق باشید.

vb.net.33
یک شنبه 06 آذر 1390, 18:41 عصر
کدی که شما نوشته اید به این معنی است که "m رو یک بیت به سمت چپ Shift بده" و البته میشد بدین شکل نوشت:


مفهوم جمله بالاتون چی هستش؟ من متوجه نشدم.

محمد فدوی
یک شنبه 06 آذر 1390, 19:43 عصر
اعداد در کامپیوتر بصورت باینری (مبنای 2) (همون 1 و 0!) ذخیره میشن برای فهمیدن مفهوم شیفت یک مثال می زنم...
همه می دونیم که 6 در مبنای 2 میشه 00000110 (این صفرها اجباری نیست! ولی در کامپیوتر این صفر ها به معنای طول متغیره مثلا در اینجا یعنی متغیری که توش 3 رو گذاشتیم 1 بایتیه...)
حالا میخوایم شیفت راست (Right Shift) رو تمرین کنیم در این حالت به تعداد مورد نظر عدد رو به سمت راست منتقل میکنه و از طرف دیگه صفر اضافه می کنه
اینو ببینید:

Dim i As Byte = 6
Dim rShift1 As Byte = (i << 1)
''' rShift1 = (00000110 << 1) = 00001100

Dim rShift2 As Byte = (i << 2)
'''rShift2 = (00000110 << 2) = 00011000

و در نهایت rShift1 برابر 12 و rShift2 برابر 24 میشه.

در شیفت چپ (Left Shift) برعکس عدد رو به راست منتقل میکنه و از طرف دیگه صفر می ذاره جاش!

مثلا:

Dim i As Byte = 6
Dim lShift1 As Byte = (i >> 1)
''' lShift1 = (00000110 >> 1) = 00000011

Dim lShift2 As Byte = (i >> 2)
''' lShift2 = (0000110 >> 2) = 00000001

و در پایان مقدار lShift1 برابر 3 و مقدار lShift2 برابر 1 میشه.

و باید توجه داشت که شیفت هم با ضرب و تقسیم بر 2 فرق داره و هم میتونه نتایج خیلی عجیب و غریبی به ما بده!

vb.net.33
یک شنبه 06 آذر 1390, 22:30 عصر
اعداد در کامپیوتر بصورت باینری (مبنای 2) (همون 1 و 0!) ذخیره میشن برای فهمیدن مفهوم شیفت یک مثال می زنم...
همه می دونیم که 6 در مبنای 2 میشه 00000110 (این صفرها اجباری نیست! ولی در کامپیوتر این صفر ها به معنای طول متغیره مثلا در اینجا یعنی متغیری که توش 3 رو گذاشتیم 1 بایتیه...)
حالا میخوایم شیفت راست (Right Shift) رو تمرین کنیم در این حالت به تعداد مورد نظر عدد رو به سمت راست منتقل میکنه و از طرف دیگه صفر اضافه می کنه
اینو ببینید:

Dim i As Byte = 6
Dim rShift1 As Byte = (i << 1)
''' rShift1 = (00000110 << 1) = 00001100

Dim rShift2 As Byte = (i << 2)
'''rShift2 = (00000110 << 2) = 00011000

و در نهایت rShift1 برابر 12 و rShift2 برابر 24 میشه.

در شیفت چپ (Left Shift) برعکس عدد رو به راست منتقل میکنه و از طرف دیگه صفر می ذاره جاش!

مثلا:

Dim i As Byte = 6
Dim lShift1 As Byte = (i >> 1)
''' lShift1 = (00000110 >> 1) = 00000011

Dim lShift2 As Byte = (i >> 2)
''' lShift2 = (0000110 >> 2) = 00000001

و در پایان مقدار lShift1 برابر 3 و مقدار lShift2 برابر 1 میشه.

و باید توجه داشت که شیفت هم با ضرب و تقسیم بر 2 فرق داره و هم میتونه نتایج خیلی عجیب و غریبی به ما بده!


همه اینها صحیح اما ما چه نیازی داریم اعداد رو شیفت کنیم؟ اصولا در کای برنامه نویسی نیاز به شیفت پیدا می کنیم؟

محمد فدوی
دوشنبه 07 آذر 1390, 18:37 عصر
بله شیفت جزء مهمترین قابلیت های بزنامه نویسی هستش.
مثلاً الگوریتم ضرب و تقسیم در کامپیوتر از شیفت استفاده می کنند. ولی در برنامه نویسی های سطح بالا خیلی کم از چیزهایی شیفت، نقیض بیتی، و حتی یای انحصاری(XOR) استفاده میشه.
ولی یه سری به منابع اسمبلی یا حتی سی بزنید... کاربردش رو متوجه میشید. مثلا در VC++ MFC (اگر آشنایی داشته باشید) ماکروهایی مثل RGB وجود دارن که از شیفت استفاده می کنن.

یه مثال میزنم. فرض کنید شما میخواید تو همین VB.NET یه مجموعه ی بزرگ از Boolean ها رو داشته باشید و حجم داده ها برای شما خیلی مهم باشه و ندونید که کلاسی در دات نت برای این کار وجود داره!!!
شما میتونید که هر بایت حافظه رو (که 8 تا 0 و 1 داره) بصورت یک آرایه ی 8 تایی از Boolean ها ببینید!

مثلا تابع های زیر میتونن 8 Boolean رو که در حالت معمولی 8 بایت ازفضا رو میگیره در 1 بایت ذخیره کنن و بالعکس:
Private Function Combine(ByVal arr As Boolean()) As Byte
If (arr.Length = 8) Then
Combine = 0
For i As Byte = 0 To 7
Combine = (Combine Or (IIf(arr(i), 1, 0) << i))
Next i
Else
Throw New Exception("Something here...")
End If
End Function

Private Function Decombine(ByVal value As Byte) As Boolean()
Dim result As Boolean() = New Boolean(7) {0, 0, 0, 0, 0, 0, 0, 0}

For i As SByte = 0 To 7
result(i) = CBool((value << (7 - i)) >> 7)
Next i

Return result
End Function

vb.net.33
دوشنبه 07 آذر 1390, 19:16 عصر
مثلا تابع های زیر میتونن 8 Boolean رو که در حالت معمولی 8 بایت ازفضا رو میگیره در 1 بایت ذخیره کنن و بالعکس:

اینی که شما می فرمائید فوق العاده هستش.

حالا با اعمال تغییری که فرمودین تاثیری در سرعت اجرای برنامه به وجود می آد؟(اگه آره سرعت اجرا را قبل و بعد از اعمال تغییر چطوری اندازه بگیریم.البته منظور من از لفظ سرعت به اون معنا نیست ها m/s هه هه)

در ضمن با نگاهی دوباره به انچه که خودتان بالا فرمودین چرا مایکروسافت می آد فضای بیشتر و بیخودی را برا بولن می ده!!! در حالی که می تونست تو یک بایت ذخیرش کنه!!!

محمد فدوی
دوشنبه 07 آذر 1390, 19:27 عصر
بله سرعت در اجرای برنامه میاد پایین...
ببینید توی کامپیوتر کوچکترین واحد پردازشی در سیستم یک بایت هست نه یک بیت.
یعنی درسته که ما میتونیم بیت هارو در یک بایت دستکاری کنیم ولی در این حالت هم مجبوریم داده هارو یک بایت یک بایت بخونیم و بنویسیم.
خلاصه در مبحث مطروحه(!!!) بستگی داره که شما چی رو ترجیح بدید...
اگه توی برنامه مثلا 30 - 20 تا Boolean نیاز دارید استفاده از این روش درست نیست ولی اگه میخواید همین تعداد Boolean رو ذخیره کنید روی یک فایل این کار مناسبه...

در آخرم بگم دات نت خودش یک کلاس خوب برای این کار داره:
System.Collections.BitArray