বুলিয়ান মান ফ্লিপ করার সহজ উপায়?


124

আমি ইতিমধ্যে এটি কি এর উপর ভিত্তি করে একটি বুলিয়ান ফ্লিপ করতে চাই। যদি এটি সত্য হয় - এটি মিথ্যা করুন। যদি এটি মিথ্যা হয় - সত্য করে দিন।

এখানে আমার কোড সংক্ষেপ:

switch(wParam) {

case VK_F11:
  if (flipVal == true) {
     flipVal = false;
  } else {
    flipVal = true;
  }
break;

case VK_F12:
  if (otherVal == true) {
     otherValVal = false;
  } else {
    otherVal = true;
  }
break;

default:
break;
}

উত্তর:


341

আপনি এর মতো একটি মূল্য ফ্লিপ করতে পারেন:

myVal = !myVal;

সুতরাং আপনার কোডটি এখানে সংক্ষিপ্ত হবে:

switch(wParam) {
    case VK_F11:
    flipVal = !flipVal;
    break;

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}

7
কেবল এটিই সহজতম নয়, সবচেয়ে পরিষ্কার উপায়।
শার্পটোথ

দুটি জিনিস একই জিনিস হিসাবে একত্রিত হতে পারে।
ডেভিড অ্যালান ফিঞ্চ

1
ডিফল্ট: বিরতি; সত্যিই প্রয়োজনীয়? স্যুইচটি কি এটির মতো শেষ হবে না?
ক্রিস লুৎজ

12
ডিফল্ট: বিরতি; অপ্রয়োজনীয়
রব কে

4
যদি আপনি অবজেক্ট 1-> system1.system2.system3.parameter1 এর মতো দীর্ঘ-বায়ুযুক্ত কিছু টগল করছেন তবে এটি একটি টগল (ক) ম্যাক্রো রাখা সহায়ক হতে পারে। এটি কিছু ভুল প্রতিরোধ করে এবং সরু স্ক্রিনগুলিতে এগুলি আরও বেশি পাঠযোগ্য।
ওজেডাব্লু

77

স্পষ্টতই আপনার প্রয়োজন কারখানার প্যাটার্ন!

KeyFactory keyFactory = new KeyFactory();
KeyObj keyObj = keyFactory.getKeyObj(wParam);
keyObj.doStuff();


class VK_F11 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class VK_F12 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class KeyFactory {
   public KeyObj getKeyObj(int param) {
      switch(param) {
         case VK_F11:
            return new VK_F11();
         case VK_F12:
            return new VK_F12();
      }
      throw new KeyNotFoundException("Key " + param + " was not found!");
   }
}

: ডি

</sarcasm>

9
আমরা সম্ভবত কারখানার জন্য একক প্যাটার্ন যুক্ত করতে পারি।
ড্র

কারণ @Orm আপনি একটি হয় ORM ? :)
mlvljr

3
জাভাতে স্যুইচ করার সূক্ষ্ম সুপারিশটি নোট করুন!
যান্ত্রিক শামুক

ঠিক আছে ... আমি মনে করি আমাদের
এটির

এই যে বন্ধুরা! আমি মনে করি আপনার পদ্ধতির অনুতপ্ত নয়। আপনার কমপক্ষে অ্যাটমিক_বুল প্রয়োজন, আরও ভাল একটি মিউটেক্স বা ইভেন্টের সারি। আরও, ভ্যালের অবস্থা পর্যবেক্ষণ করতে আমাদের পর্যবেক্ষক-প্যাটার্ন প্রয়োজন
মার্কো ফ্রয়েডেনবার্গার

38

যদি আপনি জানেন মানগুলি 0 বা 1 হয় তবে আপনি করতে পারেন flipval ^= 1


1
লজিক্যাল অপারেশনের জন্য কেন বিটওয়াস অপারেটর ব্যবহার করবেন? আমার কাছে অযথা দুর্গন্ধের গন্ধ।
মার্ক পিম

5
@ মার্ক: দুঃখিত অনুমান আমি পুরানো ed আপনার এল-ভ্যালু এক্সপ্রেশনটি যদি সত্যিই দীর্ঘ হয় তবে এটি আপনাকে সহায়তা করে so এছাড়াও, আপনি ফ্লিপওয়াল ^ = সত্য বলতে পারেন। এটা কি ভালো?
মাইক ডুনলাভে

6
@ অ্যালনিটাক: আপনি কিছু পরিস্থিতিতে ঠিক বলেছেন। কিছু লোককে "স্থান বাঁচাতে" একসাথে বিট প্যাক করতে দেখেছি এবং তাদের অ্যাক্সেসের নির্দেশাবলীর কোনও স্থান নেয় নি বলে কাজ করে।
মাইক ডুনলাভে

2
@Albert: ^হয় একচেটিয়া বা অপারেটর। 0^1হয় 1, এবং 1^1হয় 0। এটি যদি ক্যারি বিটটিকে উপেক্ষা করেন তবে যোগ করার মতোই। অথবা আপনি এটি হিসাবে ভাবতে পারেন - যদি বিট 1 হয় তবে ফলাফলটি অন্য বিটের বিপরীত হয়। অথবা আপনি এটি প্রশ্ন জিজ্ঞাসা করে ভাবতে পারেন: এই দুটি বিট কি আলাদা?
মাইক ডুনলাভে

1
@ মাইকডুনলাভে যদি আপনি কোনও ডিভাইসে কোড স্পেসের জন্য 4 এম ফ্ল্যাশ এবং 3 ডি এসআরএম ডেটা স্পেসের জন্য রাখেন তবে এটি অভিনয়ের ন্যায়সঙ্গত উপায়!
এমএম

33

সবচেয়ে সহজ সমাধান যা আমি পেয়েছি:

x ^= true;

11
x = !x;শুধুমাত্র খাটো নয়, আরও সুগঠিত।
রডরিগো

13
মনে রাখবেন যে উদাহরণস্বরূপের longVariableName ^= true;তুলনায় স্পষ্টতই খাটো longVariableName = !longVariableName;এবং প্রতিটি প্রোগ্রামারকে এক্সওআর জানা উচিত।
xamid

a ^= bএর অর্থ a = a ^ b, যেখানে ^XOR এর অর্থ। স্বরলিপি a °= bজন্য a = a ° bকোন অপারেটর জন্য °সি / সি ++ / C # এর সিনট্যাক্স মধ্যে খুব সাধারণ।
xamid

2
কৌতুকপূর্ণ, তবে আমি সম্প্রতি লাইনটি পেরিয়ে এসেছি gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value = !gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value;অবশ্যই, সবচেয়ে পরিষ্কার কাজটি হ'ল এটি একাধিক লাইনে প্রসারিত করা এবং বস্তুগুলি সংরক্ষণের জন্য অস্থায়ী পরিবর্তনগুলি ব্যবহার করা, তবে gRackWidget->modules->first().lights[PATTERN1_LIGHT + i].value ^= 1মূল পাঠের চেয়ে অনেক বেশি পঠনযোগ্য, কম ত্রুটিযুক্ত প্রবণতা এবং কম অক্ষরগুলি রয়েছে is ।
ভোর্টিকো

1
অধিকন্তু, কম সদৃশ অর্থ দ্রুত বিকাশ পরিবর্তন / দীর্ঘ দিন / রাতের কোডিংয়ের সময় সমীকরণের দুটি দিক আপডেট করতে ভুলে যাওয়ার কম সুযোগ।
ক্যাটাস্টিক ভয়েজ

11

কেবল তথ্যের জন্য - যদি কোনও পূর্ণসংখ্যার পরিবর্তে আপনার প্রয়োজনীয় ক্ষেত্রটি বৃহত ধরণের মধ্যে একক হয় তবে পরিবর্তে 'xor' অপারেটরটি ব্যবহার করুন:

int flags;

int flag_a = 0x01;
int flag_b = 0x02;
int flag_c = 0x04;

/* I want to flip 'flag_b' without touching 'flag_a' or 'flag_c' */
flags ^= flag_b;

/* I want to set 'flag_b' */
flags |= flag_b;

/* I want to clear (or 'reset') 'flag_b' */
flags &= ~flag_b;

/* I want to test 'flag_b' */
bool b_is_set = (flags & flag_b) != 0;

9

এটি সবার জন্য একটি মুক্ত বলে মনে হচ্ছে ... হি। এখানে আরেকটি বৈকল্পিকতা রয়েছে, যা আমি অনুমান করি যে প্রোডাকশন কোডের জন্য আমি প্রস্তাব করব তার চেয়ে "চালাক" বিভাগে আরও বেশি:

flipVal ^= (wParam == VK_F11);
otherVal ^= (wParam == VK_F12);

আমার ধারণা এটির সুবিধাগুলি হ'ল:

  • খুব পরিশ্রুত
  • শাখা প্রয়োজন হয় না

এবং ঠিক যেমন সুস্পষ্ট অসুবিধা হয়

  • খুব পরিশ্রুত

এটি ব্যবহার করে @ করোনার সমাধানের খুব কাছাকাছি?: তবে আরও একটি (ছোট) পদক্ষেপ নেওয়া হয়েছে।


2
ক্রিয়াকলাপের ক্রম অনুসারে, আমি মনে করি আপনি আরও বেশি সংক্ষেপের জন্য প্রথম বন্ধনী বাদ দিতে পারেন। : ও
ড্র

8

বুল টগল করার জন্য আমার প্রিয় বিজোড় বলের তালিকাটি তালিকাভুক্ত না হওয়ার কারণে ...

bool x = true;
x = x == false;

খুব কাজ করে। :)

(হ্যাঁ x = !x;স্পষ্ট এবং পড়া সহজ)


6

কোডগল্ফের সমাধানটি আরও ভালো হবে:

flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;

2

আমি জন টি এর সমাধানটিকে পছন্দ করি তবে আপনি যদি সমস্ত কোড-গল্ফ যেতে চান তবে আপনার বক্তব্যটি যৌক্তিকভাবে এটিকে হ্রাস করে:

//if key is down, toggle the boolean, else leave it alone.
flipVal = ((wParam==VK_F11) && !flipVal) || (!(wParam==VK_F11) && flipVal);
if(wParam==VK_F11) Break;

//if key is down, toggle the boolean, else leave it alone.
otherVal = ((wParam==VK_F12) && !otherVal) || (!(wParam==VK_F12) && otherVal);
if(wParam==VK_F12) Break;

আপনার কি ভিপি_এফ 11 এবং ভি কে_এফ 12 এর বিরুদ্ধে ডাব্লুপ্রাম চেক করতে হবে না?
ড্রিবি


0

স্পষ্টতই আপনার একটি নমনীয় সমাধান দরকার যা বুলিয়ান হিসাবে মাস্ক্রেডিংয়ের ধরণগুলিকে সমর্থন করতে পারে। নিম্নলিখিত এটির জন্য অনুমতি দেয়:

template<typename T>    bool Flip(const T& t);

এরপরে আপনি এটি বিভিন্ন ধরণের জন্য বিশেষায়িত করতে পারেন যা বুলিয়ান বলে ভান করতে পারে। উদাহরণ স্বরূপ:

template<>  bool Flip<bool>(const bool& b)  { return !b; }
template<>  bool Flip<int>(const int& i)    { return !(i == 0); }

এই নির্মাণ ব্যবহারের একটি উদাহরণ:

if(Flip(false))  { printf("flipped false\n"); }
if(!Flip(true))  { printf("flipped true\n"); }

if(Flip(0))  { printf("flipped 0\n"); }
if(!Flip(1)) { printf("flipped 1\n"); }

না, আমি সিরিয়াস নই।


0

0 এবং 1 এর মান সহ পূর্ণসংখ্যার জন্য আপনি চেষ্টা করতে পারেন:

value = abs(value - 1);

সি তে মেগাওয়াট:

#include <stdio.h>
#include <stdlib.h>
int main()
{
        printf("Hello, World!\n");
        int value = 0;
        int i;
        for (i=0; i<10; i++)
        {
                value = abs(value -1);
                printf("%d\n", value);
        }
        return 0;
}

0

আমি কোড প্রশ্ন করতে চান কারণ। আমি প্রস্তাব দিচ্ছি যে আপনি এই জাতীয় কিছু করেও এরশাসনের ব্যবহার করতে পারেন:

উদাহরণ:

bool flipValue = false;
bool bShouldFlip = true;
flipValue = bShouldFlip ? !flipValue : flipValue;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.