টিলেড অপারেটর সি


96

আমি টিএলডি অপারেটরটি দেখতে পেয়েছি ইএলএফ হ্যাশিং অ্যালগরিদমে ব্যবহৃত হয়েছে এবং আমি কী আগ্রহী তা জানতে আগ্রহী। (কোডটি চিরন্তন বিভ্রান্ত থেকে

unsigned elf_hash ( void *key, int len )
{
  unsigned char *p = key;
  unsigned h = 0, g;
  int i;

  for ( i = 0; i < len; i++ ) {
    h = ( h << 4 ) + p[i];
    g = h & 0xf0000000L;

    if ( g != 0 )
      h ^= g >> 24;

    h &= ~g;
  }

  return h;
}

উত্তর:


128

~অপারেটর, bitwise হয় না , এটি একটি বাইনারি সংখ্যাকে বিট inverts:

NOT 011100
  = 100011

4
বিটওয়াইস নট বিভিন্ন জিনিসের জন্য কার্যকর নয়, উদাহরণস্বরূপ, বিট মাস্কগুলি। স্বাক্ষরিত পূর্ণসংখ্যার রূপান্তরকে স্বাক্ষর না করে আপনি কী বোঝেন তা আমি নিশ্চিত নই।
GWW

4
অপেক্ষা করুন, আপনার বিটমাস্ক করার কথা না? আমার বিট রিডার এটি কীভাবে করছে, তবে তা স্পর্শকাতর। আমি পড়েছি যদি আপনার এক্স থাকে এবং তা না থাকে তবে আপনি একটি স্বাক্ষরিত সংখ্যার স্বাক্ষরিত সংস্করণটি পেয়ে যাবেন, এটি কি সঠিক নয়?
মারকাসজে

4
আমি বিটওয়াস না করে বিটমাস্কে এবং এর সাথে একত্রে নির্দিষ্ট বিটগুলি পরিবর্তন করার আগে বিট সাফ করার জন্য ব্যবহার করি।
GWW

4
কেউ "স্বাক্ষরিত স্বাক্ষরিত স্বাক্ষরিত" সম্পর্কে জিজ্ঞাসা করেছিলেন। পরিচালিত অপারেশনটিকে ~"একের পরিপূরক" নামেও অভিহিত করা হয় যা বাইনারি অবহেলার একধরনের রূপ। কার্যত সমস্ত আধুনিক কম্পিউটার দুটি এর পরিপূরক গাণিতিক ব্যবহার করে, যা বিটওয়াইস বিপরীতমুখী, আরও একটি। সুতরাং একটি স্বাক্ষরিত পূর্ণসংখ্যা পরিবর্তনশীল জন্য x, আপনি সাধারণত যে পাবেন ~x + 1মানের সমান দেয় -x। উদাহরণস্বরূপ, আমার মেশিনে printf("%hx %hx\n", -1234, ~1234 + 1)প্রিন্ট fb2e fb2eকরুন।
স্টিভ সামিট

4
@ মার্কাসজে হ্যাঁ, এর পরিপূরক স্বাক্ষরযুক্ত স্বাক্ষরিত (স্বাক্ষরিত>> স্বাক্ষরিত) রূপান্তর করতে কাজ করে। (নোট যদিও এটা ঠিক দায়িত্ব অর্পণ করা একটি পরিবর্তনশীল মান ভিন্নভাবে এবং কম্পাইলার চিন্তা লেট এটি সম্পর্কে। ঘোষিত সহজ) কিন্তু এটা করে না প্রায় (unsigned-> স্বাক্ষরিত), আংশিক কারণ সম্ভব স্বাক্ষরবিহীন মান জুড়ে বৃহত্তর পরিসর অন্যান্য উপায় কাজ একটি স্বাক্ষরযুক্ত ভেরিয়েবল হিসাবে crammed করা যেতে পারে, এবং আংশিক কারণ যে সমস্যাটি সম্ভবত বাইরের তথ্য নির্দিষ্ট করে ছাড়া সংজ্ঞায়িত করা হয় না - কি সাইন উদ্ভাবন করতে। আপনার দুটি মন্তব্যে বিভিন্ন জবাব পেয়েছে কারণ তারা বিপরীত দিকনির্দেশ নির্দিষ্ট করে।
চক কলার্স

43

~বিটওয়াইজ নট অপারেটর। এটি অপারেন্ডের বিটগুলি উল্টে দেয়।

উদাহরণস্বরূপ, যদি আপনার:

char b = 0xF0;  /* Bits are 11110000 */
char c = ~b;    /* Bits are 00001111 */

12

এটি বিটওয়াইজ নট অপারেটর। এটি একটি সংখ্যাতে সমস্ত বিটগুলি ফ্লিপ করে: 100110 -> 011001


8

টিল্ড অক্ষর একটি পূর্ণসংখ্যার সমস্ত বিট উল্টাতে অপারেটর হিসাবে ব্যবহৃত হয় (বিটওয়াইস নট)

উদাহরণস্বরূপ: ~0x0044 = 0xFFBB



1

টিল্ড অপারেটর (~) এছাড়াও bitwise না অপারেটর বলা হয়, সঞ্চালিত একজনের পরিপূরক আর্গুমেন্ট হিসাবে কোন বাইনারি সংখ্যা। অপারেন্ডটি যদি না দশমিক সংখ্যা হয় তবে এটি এটিকে বাইনারি হিসাবে রূপান্তর করে এবং এর পরিপূরক অপারেশন করে perform

কারও পরিপূরক গণনা করা সহজভাবে সমস্ত অঙ্ক [0 -> 1] এবং [1 -> 0] প্রান্ত: 0101 = 5; 0 (0101) = 1010. টিলড অপারেটরের ব্যবহার: ১. এটি মাস্কিং অপারেশনে ব্যবহৃত হয়, মাস্কিং মানে কোনও রেজিস্টারের অভ্যন্তরে মানগুলি সেট করা এবং পুনরায় সেট করা। প্রাক্তন জন্য:

char mask ;
mask = 1 << 5 ;

এটি 10000 এর বাইনারি মানকে মাস্ক সেট করবে এবং এই মুখোশটি অন্যান্য ভেরিয়েবলের ভিতরে থাকা বিট মানটি পরীক্ষা করতে ব্যবহার করা যেতে পারে।

int a = 4;
int k = a&mask ; if the 5th bit is 1 , then k=1 otherwise k=0. 

একে বলা হয় বিটস এর মাস্কিং । ২.ম্যাসিংয়ের বৈশিষ্ট্য ব্যবহার করে যে কোনও সংখ্যার বাইনারি সমতুল্য সন্ধান করুন।

#include<stdio.h>
void equi_bits(unsigned char);
int main()
{
    unsigned char num = 10 ;
    printf("\nDecimal %d is same as binary ", num);
    equi_bits(num);
    return 0; 
} 
void equi_bits(unsigned char n)
{
  int i ; 
  unsigned char j , k ,mask ;
  for( i = 7 ; i >= 0 ; i--)
  {
     j=i;
     mask = 1 << j;
     k = n&mask ; // Masking
     k==0?printf("0"):printf("1");
  }  
}

আউটপুট: দশমিক 10 00001010 এর সমান

আমার পর্যবেক্ষণ : যে কোনও ডেটা প্রকারের সর্বাধিক পরিসরের জন্য, এর পরিপূরকটি কোনও সংশ্লিষ্ট মানের সাথে 1 দ্বারা হ্রাস পেয়েছে negativeণাত্মক মান সরবরাহ করে। উদা:
~ 1 --------> -2
~ 2 ---------> -3
এবং আরও ... আমি আপনাকে ছোট কোড স্নিপেট ব্যবহার করে এই পর্যবেক্ষণটি দেখাব

#include<stdio.h>
int main()
{
    int a , b;
    a=10;
    b=~a; // b-----> -11    
    printf("%d\n",a+~b+1);// equivalent to a-b
    return 0;
}
Output: 0

দ্রষ্টব্য: এটি কেবল তথ্য প্রকারের ব্যাপ্তির জন্য বৈধ। অর্থ উপাত্তের প্রকারের জন্য এই বিধিটি কেবলমাত্র [-2,147,483,648 থেকে 2,147,483,647] এর মানের জন্য প্রযোজ্য।
থ্যাঙ্কিউ ..... এটি আপনাকে সাহায্য করতে পারে

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