01/10/2018, 08:21
Pointer C. p++ và p>>=1;
Ai giải thích giúp e khi là khai báo 1 con trỏ : int *p;
rồi thực hiện : p++; và p>>=1; thì 2 thao tác này có nghĩa như nhau k ạ ? Nó có tác dụng chi tiết như nào ạ?
Bài liên quan
p >>= 1 là lệnh ghép của p = p >> 1, tức là đem p dịch phải 1 bit.
còn ++ là gì thì không cần phải nói rồi nhé
vậy a có thể giải thích cho e code này hoạt động ntn k ạ ?
p >>= 1
tương đương vớip = p >> 1
Cũng giống như
p += 1
chính làp = p + 1
, hay như các toán tử gán-=
,*=
,/=
…Còn p++ thì nó hơi phức tạp hơn:
Mình không biết override operator trong C nên mình dùng thuật toán diễn tả hàm nhé:
Giả sử có
int x = 2
. Nếu bạn chạy lệnhx++
thì ta cóx == (int) 3
. Tuy nhiên nếu bạn chạy lệnhint y = x++
thì ta sẽ cóy == (int) 2
vàx == (int) 3
thì như cái tên của hàm, in dãy bit của 1 biến float. Nhưng code này nó code tào lao rồi =)))
code bị ngược chỗ *temp >= 0 chứ in ra được đó
in ra
“ngon lành” mà.
Wiki:
để biết bit đầu là 1 hay 0 bằng cách cast về
int
rồi so sánh < 0 là số âm tức bit đầu là bit 1, rồi cứ thế dịch bit trái từ từ hết 32 bit. Có nhiều cái nguy hiểm nhưng ko sao vì đây là C nổi tiếng nguy hiểm màHi Nguyen Trong Dung.
Cái lõi của hàm này có 2 điểm.
1 Ép kiểu vung nhớ để chuyển vùng nhớ float thành 1 vùng nhớ nguyên để co thể thực hiện phép dịch bit trên đó.
2 Dùng bit dấu để xác đinh in ra là 1 hay 0 khi dich dần các bit.
Thực ra nếu đã chơi bitmask thì người ta xài unsigned thôi chẳng qua là do dịch trái nên ko bị dính chưởng. Nhưng bài này xài signed lại nhanh, phải bookmark.
Còn nữa là cái này là đọc dạng IEEE chứ ko phải đổi số gì gì đâu.
p/s: câu đổi kiểu đấy C99 cho undefined rồi. Làm đúng thì phải ntn. http://stackoverflow.com/questions/11638091/getting-the-ieee-single-precision-bits-for-a-float