2010-09-13 16 views
8

कुछ स्पष्ट करने की मांग।तार्किक, अंकगणितीय बिटवाई बदलाव

यह मेरी समझ है कि अंकगणितीय, तार्किक बिटवाइज़ बदलाव के संबंध में:

  1. << काम दोनों
  2. >> बदलाव के लिए एक ही है कि तार्किक पारी में 0 के साथ हमेशा होगा पैड बाइट भिन्न होते हैं, अंकगणितीय पारी जबकि साइन बिट के साथ इसे पैड करेगा।

मैं सी का उपयोग करके इसे कैसे अलग कर सकता हूं?

मैं क्या समझ से, वास्तविक ऑपरेटरों एक ही << हैं, >>

में क्या अंतर के बीच कमान होगा:

int i=1; 
printf ("%d\n", i >> 1); // logical shift 

int j=1; 
printf ("%d\n", j >> 1); // arithmetical shift 

कृपया मुझे पता है, गैर नकारात्मक संख्या के मामले में

उत्तर

13

, दोनों सही बदलाव के प्रकार समान हैं। अंतर तब दिखाई देता है जब शिफ्ट करने की संख्या ऋणात्मक होती है।

असल में सी मानक निर्दिष्ट नहीं करता है कि >> जब तर्क नकारात्मक होता है तो तार्किक या अंकगणितीय शिफ्ट करना चाहिए, लेकिन आम तौर पर, यह अंकगणितीय शिफ्ट करता है। तार्किक बदलाव करने के लिए, संख्या, इसी अहस्ताक्षरित प्रकार के कास्ट किया जाना चाहिए for example:

int x = -2; 
int y = x >> 1; // arithmetic shift. 
assert (y == -1); 
int z = (unsigned)x >> 1; // logical shift. 
assert (z == 0x7FFFFFFF); 
+0

वहाँ एक विशेष बदलाव के लिए मजबूर करने का कोई तरीका है। उदाहरण के लिए, मैं संकेत छोड़ने के लिए (x <<1)>> 1 "- – JAM

+0

@ जेरी, @ एमएसी: अपडेट देखें। – kennytm

+1

@mac: साइन बिट को छोड़ना पूर्ण नहीं है दो के पूरक में मूल्य – jamesdlin

संबंधित मुद्दे