আমি কীভাবে সি তে একটি পতাকা মুছতে পারি?


148

একটি পরিবর্তনশীল রয়েছে যা কিছু পতাকা ধারণ করে এবং আমি সেগুলির একটি অপসারণ করতে চাই। তবে আমি কীভাবে এটি সরিয়ে ফেলতে জানি না।

এখানে আমি পতাকাটি সেট করি।

my.emask |= ENABLE_SHOOT;

6
আপনি এসও প্রশ্নের উত্তর পেতে পারেন "আপনি কীভাবে সি'তে একটি বিট সেট করবেন, সাফ করবেন এবং টোগল করবেন" সহায়ক helpful
স্কচট

উত্তর:


339

সংক্ষিপ্ত উত্তর

আপনি যে পতাকাটি আনসেট করতে চান তা বিটওয়াইস নট অপারেশন দিয়ে আপনি বর্তমান মানটিতে একটি বিটওয়াস এবং অপারেশন করতে চান । একটি বিটওয়াইস প্রতিটি বিট উল্টায় না (যেমন 0 => 1, 1 => 0)।

flags = flags & ~MASK;বা flags &= ~MASK;

দীর্ঘ উত্তর

ENABLE_WALK  = 0    // 00000000
ENABLE_RUN   = 1    // 00000001
ENABLE_SHOOT = 2    // 00000010
ENABLE_SHOOTRUN = 3 // 00000011

value  = ENABLE_RUN     // 00000001
value |= ENABLE_SHOOT   // 00000011 or same as ENABLE_SHOOTRUN

আপনি যখন একটি বিটওয়াস এবং বিটওয়াইসের সাথে মানটি সেট না করে মান নির্ধারণ করেন When

value = value & ~ENABLE_SHOOT // 00000001

আপনি আসলে করছেন:

      0 0 0 0 0 0 1 1     (current value)
   &  1 1 1 1 1 1 0 1     (~ENABLE_SHOOT)
      ---------------
      0 0 0 0 0 0 0 1     (result)

@ অ্যারন: আমি আনন্দিত যে এটি সাহায্য করেছে। কাগজে এটি ব্যাখ্যা করতে কেউ 10 মিনিট সময় না নিয়ে অবধি আমার বিটওয়াইজ অপারেশনগুলি বুঝতে সমস্যা হয়েছিল।
ডেনিস

1
@ ডেনিস আমি ভেবেছিলাম XOR ইতিমধ্যে সেট করা পতাকা সরানোর জন্য কাজ করবে। notification.sound ^= Notification.DEFAULT_SOUND;
Likejudo

3
আপনি কীভাবে ওয়াক সক্ষম করবেন? যেহেতু এক্স | 0 == এক্স
ইউনিকর্ন

@ ইউনিকর্ন উল্লেখ করেছেন যে, শূন্যের একটি পতাকা মান সঠিকভাবে কাজ করে না, হয় আপনি চেষ্টা করতে চেষ্টা করুন যদি এটি অন করে রাখেন বা আপনি চেষ্টা করেন এবং এটি বন্ধ করে দেন।
রেনিপেট

হাঁটা সক্ষম করতে, আপনাকে কেবল রান অক্ষম করতে হবে (যা বিট 1 সেট থেকে 0 এ চলে যাবে)। ENABLE_ * পতাকাগুলি দশমিক সংখ্যা হিসাবে ভাবেন না, তবে বাইনারি সংখ্যা হিসাবে, হয় বা বন্ধ থাকে। আপনি এখনও স্পষ্টভাবে হাঁটা সক্ষম বা অক্ষম করতে পারবেন না ।
জ্যাকব দেগলিং


13

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


5
অজ্ঞাপূর্ণ কর্নার কেসটি ধরার জন্য +1। এটি এড়ানোর একটি উপায় পরিবর্তে ব্যবহার করা flags -= flags & MY_FLAG;(বা ^=যদি আপনি পছন্দ করেন)।
আর .. গিথহাব বন্ধ করুন ICE

1
@ আর .. আমি '' = 'ব্যবহার করতাম ব্যতীত এটি বিটগুলি টগল করে এবং কখনও কখনও আপনি হয়ত জানেন না যে কোনটি পতাকা চিহ্নিত করা হয়েছে। আমি যদি নিশ্চিত করতে চাই যে দুটি ডানদিকের বেশিরভাগ বিট শূন্য, যেমন my.emask: '0 1 0 1' ইনপুট: '0 0 1 1' এর সাথে: '^ =' '0 1 1 0' দিয়ে: '& ~ '' 0 1 0 0 '
হেক্টর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.