10/10/2018, 00:12

PHP câu hỏi nhỏ khôg đáng mở thêm 1 chủ đề nhưng kh bít hỏi ai

Mình có đoạn code sau
<?php
$a=1;
$b=~$a;
echo $b;
?>
chạy cho ra kết quả -2
Mong được giải thích
diepnghitinh viết 02:12 ngày 10/10/2018
đoán đại vậy tin ráng chịu... $b khi không dc gán giá trị thì mặc định là 1 !! gán thêm a là 1 nữa là 1 + 1 = 2 , 2 + ~ ==> -2 hế hế có ai pro hơn tôi không??? Pó tay đúng là kiến thức còn quá hạn hẹp mong dc học hỏi thêm
coofhair viết 02:15 ngày 10/10/2018
không phải thế bro ạ
có thể viết lại thế này không cần biến b đâu
?php
$a=1;
echo ~$a;
?>
ý mình là
toán tử ~ sẽ đảo các bít của $a
mà không hiểu trong PHP khi khai báo $a=1 thì có bao nhiêu bit cho $a nhỉ
ví dụ thử 8 bít thì là thế này
$a =00000001
~$a =11111110
Vậy sao khi chạy lại ra kết quả là -2 vậy
Mình đã nghĩ đến bù 1 hay bù 2 mà vẫn không hiểu
coofhair viết 02:14 ngày 10/10/2018
Mình đọc từ nãy hiểu hết chừ mỗi cái ~ là vẫn chịu
Vẫn chưa hiểu nổi là ~1 k.q= -2


OK, here is one that gets tricky the ~ operator also known as the "NOT" operator.
$a = 9;
$b = 10;
echo $a & ~$b;

This would output the number 1. Why?? Well lets see using our table example
1 Byte ( 8 bits )
Place Value

The NOT operator wants to know what is set in $a but NOT set in $b because we marked $b with the ~operator in front of it. So looking at our table we can see the only bit set in $a thats not in $b is 1.

What happens if we do this...
$a = 9;
$b = 10;
echo ~$a & $b;

We get the value 2, because we want the bits set in $b but NOT set in $a this time, so since they both share the 8 bit, 2 bit is the only one $b has that $a does not.
amida viết 02:18 ngày 10/10/2018
Trong binary, bit đầu đc coi là bit làm dấu.

Thử test với $a = 0 ta có ~$a = -1. Có thể diễn giải như sau:

0000 0000 ($a = 0). ~$a lật ngược lại ta có:
1111 1111.

Tuy nhiên trong hệ cơ số 2 thì 0111 1111 là cao nhất (không đụng đến bit đầu). Có thể hiểu như đó là 1 dạng stack overflow nên chuyển dấu thành trừ (-). Và bit đầu kô đụng đến nên mới có công thức 2^8-1=255.

Còn vì sao tăng $a lên 1,2,3,... thì nó lại thành -2,3,4,... thì mình thực sự chưa rõ lắm
coofhair viết 02:19 ngày 10/10/2018
Mình cũng đã học qua hợp ngữ nên các phép toán trên các bít cũng nắm đựoc sơ sơ
or,and,xor,not
và số bù 1, bù 2
Nhưng thực sự vụ ~ trong PHP khiến mình băn khoăn
~0=-1
~1=-2
Nếu trong pascal
not(0)=254
not(1)=253

Not và ~ là như nhau
Rất mong đựoc giải thích rõ hơn
qhbnnam viết 02:27 ngày 10/10/2018
theo mình hiểu thì
1 = 0000 0001
đảo bit 1111 1110 cái này là -2
2 = 0000 0010
ta cộng -2 và 2
1111 1110
+
0000 0010
----------
10000 0000 = 0

mình hiểu là tràn số => ~ phép đảo bit
coofhair viết 02:15 ngày 10/10/2018
Thank qhbnnam
Uh nhỉ, chắc chắn là thế rồi

Pascal
a:=not(1)=254
a:=a-1=253
PHP
a=~1=-2
a=a-1=-3
Vậy 253 và -3 .......? == dung rồi

Không biết tron PHP thì dùng bao nhiêu bit cho các biến đó nhỉ, và phép toán còn đúng trong khoảng nào khi dùng số bù 2 đó
không rõ dàng như pascal kho hình dung quá
herofit viết 02:28 ngày 10/10/2018
Được gửi bởi coofhair
Mình có đoạn code sau
<?php
$a=1;
$b=~$a;
echo $b;
?>
chạy cho ra kết quả -2
Mong được giải thích
thấy các bạn có hứng thú trong vấn đề này mình xin tham gia một chút làm sáng tỏ vấn đề thực ra cũng rất rễ hiểu thôi
$a=0->1 và ~$a ->11111111111111111111111111111111
$a=1->1 và ~$a ->11111111111111111111111111111101
$a=2->010 và ~$a -> 11111111111111111111111111111101
mỗi số nguyên của interger có độ lớn là 4 byte= 32bit trong đó bít đầu tiên là bít dấu 1 ứng vơi âm(-) và 0 ứng với dương (+)
số âm lớn nhất(bít đầu là 1) là -1 biểu diễn 11111111111111111111111111111111
số dương nhỏ nhất(bít đầu là 0) biểu diễn 00000000000000000000000000000000
như vậy ~1 là -2 là hoàn toàn đúng theo quy luật trên

nếu các bạn không hiểu mình sẽ giải thích cặn kẽ hơn
coofhair viết 02:26 ngày 10/10/2018
thank herofit nhé,
mình cứ cảm thấy kq đưa ra như vậy nó thế nào ấy
ví dụ php
a=-2
a=a-1=-3
----------
a=2
a=~a=-3
vậy cái sau sao nó k là giá tri thập phân 252 cho dễ nhỉ,như pascal ấy
Bài liên quan
0