01/10/2018, 00:32

Phép ~ trong java

byte x = 3;
x = (byte)~x;
System.out.println(x);

Cho mình hỏi vì sao x lại ra 4 vậy ạ. Coi trên mạng thì chỉ nói ~ là phép NOT

viết 02:35 ngày 01/10/2018

Ở đây, kiểu byte là 8 bit, mình biểu diễn nhị phân 8 bit:
3 thành dạng nhị phân (binary) là: 00000011
Phép ~ là phép NOT trong bit (~0 là 1 và ~1 là 0).
~3 = 11111100 tương đương -4. Số 1 ngoài cùng bên trái dành cho dấu, nếu là số 0 thì số đó dương, số 1 là số âm.

mmmm viết 02:46 ngày 01/10/2018

Cảm ơn câu trả lời trên ạ, nhưng cách tính giá trị ép kiểu về bằng tay có thể chỉ thêm ko ạ. Có phải 11111100 =252 nhưng bị ép về byte nên 252-128=124
do 1 bit biểu diễn giá trị âm là 2^7 =128 nên lấy 128-124=4 --> giá trị ép về là -4 phải ko ạ

*grab popcorn* viết 02:41 ngày 01/10/2018

Lấy 7 bit còn lại
đảo bit và + 1 là ra số âm.

1000 0001
lấy 7 bit cuối là 000 0001 đảo bit thành 111 1110 + 1 vào thành 111 1111 (127)
-> 1000 0001 = -127

viết 02:39 ngày 01/10/2018

-x = ~x + 1 (với x là số nguyên)

cứ thế mà tính lẹ thôi. Cái này là công thức tính 2’s complement hay bù 2 gì đó.

mmmm viết 02:38 ngày 01/10/2018

Dù bị ép kiểu mất dữ liệu thì công thức này còn đúng ko ạ

mmmm viết 02:41 ngày 01/10/2018

-127 rồi sao ra kq đúng là -4 vậy bạn

*grab popcorn* viết 02:32 ngày 01/10/2018

Ặc, sorry bạn. Làm như txtntxt nói là đúng ấy.

traiotdo viết 02:35 ngày 01/10/2018

00000011 là 3 mà -3 cũng là 00000011 hả?

viết 02:38 ngày 01/10/2018

Không, cái - là dấu gạch đầu dòng đó bạn, mình viết có khoảng trắng mà

traiotdo viết 02:42 ngày 01/10/2018

sao không dùng dấu khác đi ba…người ta nhìn vào dễ lộn

Bài liên quan
0