>> এবং << পাইথনের অর্থ কী?


94

আমি লক্ষ্য করেছি যে আমি 2 << 564 পেতে এবং 1000 >> 2250 পাওয়ার মতো জিনিসগুলি করতে পারি ।

এছাড়াও আমি ব্যবহার করতে পারেন >>মধ্যে print:

print >>obj, "Hello world"

এখানে কি হচ্ছে?



4
এখানে, এখন আপনি এই চিহ্নগুলিকে কোনও অনুসন্ধান ইঞ্জিনে প্লাগ করতে পারেন এবং এটিতে তাদের প্রকৃতপক্ষে সন্ধান করতে পারেন: সিম্বহাউন্ড
ডট


4
@ ব্যবহারকারী 2357112 এটি সত্যিই সহায়ক হবে, ধন্যবাদ। এবং তাদের কাছে এটি একটি প্রাথমিক প্রশ্ন, এটি হতে পারে, তবে আমার কাছে বিটওয়াইজ অপারেটরদের ধারণা ছিল না, তাই আমি ডকুমেন্টেশনে
এটিকে

@ জোয়াকুইন এখন পাইথনের চেয়ে বৃহত্তর অজগরটির জন্য গুগলে এক নম্বর ফলাফল।
জর্ডান রিটার

উত্তর:


64

আমি মনে করি এটি গুরুত্বপূর্ণ প্রশ্ন এবং এটির এখনও উত্তর দেওয়া হয়নি (ওপি শিফট অপারেটরদের সম্পর্কে ইতিমধ্যে জানে বলে মনে হচ্ছে)। আমাকে উত্তর দেওয়ার চেষ্টা করুন, >> আপনার উদাহরণের অপারেটর দুটি পৃথক উদ্দেশ্যে ব্যবহৃত হয়। সি ++ পদে এই অপারেটরটি ওভারলোড হয়েছে। প্রথম উদাহরণে এটি বিটওয়াইড অপারেটর (বাম শিফট) হিসাবে ব্যবহৃত হয়, যখন দ্বিতীয় দৃশ্যে এটি কেবল আউটপুট পুনঃনির্দেশ হিসাবে ব্যবহৃত হয়। অর্থাত্

2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj, 

উদাহরণ

with open('foo.txt', 'w') as obj:
    print >> obj, "Hello world" # hello world now saved in foo.txt

হালনাগাদ:

অজগর 3 এ ফাইলের যুক্তিটি সরাসরি নিম্নরূপ দেওয়া সম্ভব:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt

13
এফওয়াইআই যে পাইথন কোডে আপনি দেখতে পাবেন ডান শিফট অপারেটরের আর একটি সাধারণ ব্যবহার এয়ারফ্লো ফাইলগুলিতে ঘটবে। : Airflow ফ্রেমওয়ার্ক ইঙ্গিত এক কাজের থেকে অন্য আপস্ট্রিম হল '>>' অপারেটর overloads stackoverflow.com/questions/52389105/...
schimmy

4
আপনি প্রকৃতপক্ষে পদ্ধতি __rshift__এবং __lshift__পদ্ধতিগুলির মাধ্যমে এই অপারেটরদের ওভাররাইড করতে পারেন ।
ট্রুডল্ফ

আমি পাচ্ছি যে 2 >> 5 সমান 0 হয়? আমি ভেবেছিলাম এটি 00001 এর সমান হওয়া উচিত?
lightbox142

4
@ teter123f অপারেশনটি বাইনারি। এটি দশমিক অপারেশন নয়।
yosemite_k

62

এগুলি হ'ল বিটওয়াইজ শিফট অপারেটর।

দস্তাবেজগুলি থেকে উদ্ধৃতি দেওয়া :

x << y

xY স্থানে বামে স্থানান্তরিত বিটগুলি সহ ফেরত আসে (এবং ডানদিকে নতুন বিটগুলি শূন্য হয়)। এই গুন হিসাবে একই xদ্বারা 2**y

x >> y

বি xস্থানগুলি দ্বারা y স্থানে ডানদিকে স্থানান্তরিত হয় Return এটি xদ্বারা বিভাজন হিসাবে একই 2**y


4
সম্ভবত উদাহরণস্বরূপ, সাহায্য করবে পাইথন এসব একটি সিরিজ টাইপ করুন: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)ইত্যাদি। আপনি ব্যাখ্যা ছাড়াই এটি কীভাবে কাজ করে তা দেখতে পারেন।
বারটেকব্রাক

4
বিট শিফট অপারেটরের জন্য 2 টি অপরেন্ডের প্রয়োজন তাই অপারেন্ড কেন "মুদ্রণ" এবং অপারেন্ড 2 একটি বস্তু? যেমনটি রয়েছেprint >>obj, "Hello world"
কিউ ফ্যান

এটি ওপি প্রদত্ত প্রসঙ্গে (এবং এভাবে ওপিতে পরিচিত) এর উত্তর এবং জিজ্ঞাসিত প্রশ্নের উত্তর নয়।
z33k

4
@ কিউ ফ্যান @ z33k এই উত্তরটি লেখার এক বছরেরও বেশি সময় পরে প্রশ্নটি মুদ্রণের জন্য যুক্ত করতে সম্পাদিত হয়েছিল। মূল প্রশ্নটি কেবলমাত্র 2 << 5এবং 1000 >> 2 ¯_ (ツ) _ / ¯
জেমস

26

12 << 2

48

12 এর আসল বাইনারি মান হ'ল "1100" যখন আমরা উপরের বিবৃতিটি কার্যকর করি বাম শিফট (2 স্থান বামে স্থানান্তরিত) 48 এর মান বাইনারি হয় "110000" মান প্রদান করে।

48 >> 2

12

48 এর বাইনারি মান হ'ল "110000", উপরের বিবৃতিটি কার্যকর করার পরে ডান শিফট (2 স্থান ডান স্থানান্তরিত) 12 এর বাইনারি মান "111100" মান প্রদান করে।


13

এগুলি বিট শিফট অপারেটর যা অনেকগুলি মূলধারার প্রোগ্রামিং ভাষায় বিদ্যমান, <<বাম শিফট এবং >>ডান শিফট, এগুলি নিম্নলিখিত টেবিল হিসাবে প্রদর্শিত হতে পারে, ধরে নেওয়া যাক একটি পূর্ণসংখ্যা কেবল মেমরিতে 1 বাইট নেয়।

| operate | bit value | octal value |                       description                        |
| ------- | --------- | ----------- | -------------------------------------------------------- |
|         | 00000100  |           4 |                                                          |
| 4 << 2  | 00010000  |          16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100  |           4 | move all bits to right 2 bits, filled with 0 at the left |

ঠিক এই ব্যাখ্যাটি অনুসন্ধান করা হচ্ছে।
শায়খ 14 ই

12

জড়িত অন্য কেসটি print >>obj, "Hello World"হ'ল পাইথন 2 এর print বিবৃতিটির জন্য "প্রিন্ট শেভরন" সিনট্যাক্স ( ফাংশনেরfile আর্গুমেন্ট দ্বারা প্রতিস্থাপন পাইথন 3 এ সরানো হয়েছে )। স্ট্যান্ডার্ড আউটপুটে লেখার পরিবর্তে আউটপুটটি পদ্ধতিতে পাস করা হয় । একটি সাধারণ উদাহরণ হ'ল পদ্ধতিযুক্ত ফাইল বস্তু । আরও সাম্প্রতিক প্রশ্নের উত্তর দেখুন: পাইথনে সাইন-এর চেয়ে দ্বিগুণprint() obj.write()write()


7

এগুলি হ'ল শিফট অপারেটররা

x << y বিটগুলি y টি জায়গায় বামে স্থানান্তরিত x (এবং ডানদিকের নতুন বিটগুলি শূন্য হয়) এর সাথে এক্স রিটার্ন করে। এটি 2 ** y দ্বারা x এর গুণক হিসাবে একই।

x >> y বিটগুলি সহ x টি y স্থান দ্বারা ডানদিকে স্থানান্তরিত করে s এটি // 'আইং x বাই 2 ** y এর সমান।



-1

আমি পাইথন 2.7 এবং পাইথন 3.8 উভয়টিতে নিম্নলিখিতটি যাচাই করেছি

আমি মুদ্রণ করেছি (100 << 3) 100 বাইনারি রূপান্তর 1100100 দেয়। আমি যা করলাম তা হল আমি প্রথম 3 বিট ফেলে দিয়েছিলাম এবং শেষে '0' মান সহ 3 বিট যুক্ত করেছি। সুতরাং এটির ফলাফল 0100000 হিসাবে হওয়া উচিত, এবং আমি এটিকে দশমিক হিসাবে রূপান্তর করেছি এবং উত্তরটি 32 ছিল।

আমার অবাক হওয়ার জন্য যখন আমি মুদ্রণ কার্যকর করি (100 << 3) উত্তরটি 800 ছিল I কি হচ্ছে তা পরীক্ষা করতে আমি 800 কে বাইনারি রূপান্তরিত করে। এবং এই আমি 1100100000 পেয়েছি।

আপনি যদি দেখতে পান যে পাইথন উত্তরটি কীভাবে 800 ছিল, তারা প্রথম 3 বিট স্থানান্তরিত বা ছাড়েনি তবে তারা শেষ 'বিট'তে' 0 'মান যুক্ত করেছে।

মুদ্রণ হিসাবে (100 >> 3), নিখুঁত কাজ করেছে। আমি ম্যানুয়াল গণনা করেছি এবং অজগর থেকে মুদ্রণের ফলাফল চেক করেছি। এটি সঠিকভাবে কাজ করেছে। সর্বশেষ 3 বিট বাদ দেওয়া হয়েছে এবং প্রথম 3 বিটগুলিতে মান '0' যুক্ত হয়েছে।

দেখে মনে হচ্ছে (100 << 3), বাম শিফট অপারেটরের পাইথনে একটি বাগ রয়েছে।


কোনও ত্রুটি নেই, এটি কেবলমাত্র সংখ্যা অনুসারে 8 বিটের মধ্যে সীমাবদ্ধ নয়।
Oso

<< এবং >> উভয়ই অপারেটরকে একই যুক্তি দিয়ে কাজ করা উচিত। তবে << অপারেটর অন্যরকম আচরণ করছে। আমি পাইথনের সাথে একটি আচরণগত বাগ দায়ের করেছি কেবলমাত্র জো ow
নন্দীশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.