JavaRush /Blog Java /Random-VI /Java: bit và byte
Viacheslav
Mức độ

Java: bit và byte

Xuất bản trong nhóm
Java: bit và byte - 1

Giới thiệu

Nếu con người đếm theo hệ thập phân thì máy tính đếm theo hệ nhị phân. Và một lập trình viên phải hiểu cách nói chuyện với cả con người và máy tính. Đánh giá này sẽ giúp ích trong vấn đề này. Đôi khi có cả một thế giới ẩn đằng sau những điều hiển nhiên. Tôi đề nghị nói về thế giới này. Ví dụ: một tuần có 7 ngày. Bây giờ chúng ta hãy trả lời câu hỏi: Số “7” là gì? ) Thứ nhất, đó là số tự nhiên nguyên (dương). Nó cũng là một số thập phân. Số thập phân là một số trong Hệ thập phân. Khi chúng ta nói "hệ số thập phân", điều đó có nghĩa là hệ thống số có cơ số là 10 . Cơ số cho biết có bao nhiêu chữ số có thể được sử dụng trong một hệ thống số nhất định để biểu thị một số. Việc đếm ngược là từ số không. Theo đó, để biểu diễn các số trong hệ số thập phân, chúng ta sử dụng các số từ 0 đến 9. Điều này tốt nhưng chúng ta không chỉ cần đếm đến 9 mà còn phải đếm xa hơn nữa. Làm sao để? Ví dụ: số 10. Để viết số này, chúng ta sử dụng tối đa 2 chữ số. Vị trí của mỗi chữ số trong hệ thập phân được gọi là vị trí thập phân. Các chữ số được tính từ phải sang trái:
Java: bit và byte - 2
Ngoài ra, số thập phân có thể khai triển như sau: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bit và byte - 3
Con số về cơ bản tăng dần từ phải sang trái. Nghĩa là, lúc đầu là 7, sau đó trở thành 10. Do đó, các chữ số được tính từ bên phải, bắt đầu từ số 0. Tất cả những điều này là để làm gì? Điều này là do chúng ta không phải là máy tính. Và trong khi chúng ta đếm theo số thập phân (tức là cơ số 10), thì máy tính tính theo số nhị phân (tức là cơ số 2). Nhưng các quy tắc áp dụng trong các hệ thống số này đều giống nhau.
Java: bit và byte - 4

Hệ thống nhị phân

Hệ nhị phân rất giống với hệ thập phân, điểm khác biệt duy nhất là giới hạn ở đây không phải là 10 mà là 2. Hãy so sánh với một ví dụ. Làm thế nào để chúng ta biểu diễn 11 trong hệ nhị phân? Rất đơn giản: bạn chỉ cần chia số thập phân cho cơ số 2, tức là đếm 11/2 trong một cột. Ví dụ:
Java: bit và byte - 5
Hoặc đây là một ví dụ từ WikiHow:
Java: bit và byte - 6
Điều thú vị là chúng ta có thể biểu diễn một số ở dạng nhị phân giống như trong số thập phân: 111 ở dạng nhị phân = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: bit và byte - 7
Bạn có thể xem ví dụ về chuyển đổi từ nhị phân sang thập phân trong máy tính trực tuyến . Nói về thực tế là các quy tắc hoạt động trong hệ thống số là giống nhau, chúng ta hãy xem xét phép cộng trong hệ nhị phân:
Java: bit và byte - 8
Như bạn có thể thấy, chúng ta chuyển các chữ số trong quá trình cộng theo cách tương tự như trong hệ thập phân. Phân tích bổ sung có thể được nhìn thấy, ví dụ, ở đây: Nhân tiện, một số từ "xả" được đề cập định kỳ. Và nó là gì? Địa điểm chỉ là một “yếu tố cấu trúc” để biểu diễn một con số. Tức là số 10 gồm có hai chữ số: ta cần 2 chữ số, 2 chữ số, 2 phần tử để viết số này. Điều quan trọng là chúng ta phải hiểu điều này vì trong hệ thống số nhị phân, một chữ số là một bit . Từ Bit xuất phát từ "chữ số nhị phân" trong tiếng Anh , nghĩa là số nhị phân. Nó có thể là 0 hoặc 1. Nhưng cũng giống như chúng ta đọc toàn bộ các số và từ chứ không phải từng chữ cái, máy tính không đọc từng bit một. Đối với “mảnh” thông tin được xử lý tối thiểu trong RAM (được gọi là đơn vị thông tin có thể định địa chỉ nhỏ nhất), một chuỗi 8 bit được đọc . Vì có 8 cái nên cái này được gọi là "octet". Và ngoài ra - từ Byte được biết đến nhiều hơn . Để nhớ octet, bạn có thể nhớ từ octopus (tám chân) được dịch sang tiếng Anh là octopus. Nghĩa là, đây chính xác là chữ “octo” trong tiêu đề:
Java: bit và byte - 9
Hãy thử nghĩ xem số lớn nhất mà chúng ta có thể biểu diễn dưới dạng 8 bit là bao nhiêu?
Java: bit và byte - 10
Và ở đây câu hỏi được đặt ra: còn số âm thì sao? Để hiểu điều này, hãy nói về cách biểu diễn byte trong Java
Java: bit và byte - 11

Java và Byte

Làm thế nào chúng ta có thể sử dụng số âm trong Java? Nó được thực hiện đơn giản. Trong Java, byte được ký. Chữ số/bit ngoài cùng bên trái (còn được gọi là “bit quan trọng nhất”) được tạo thành một loại “điểm đánh dấu” để trả lời câu hỏi: “Số này có âm không?” Nếu câu trả lời là có thì điểm đánh dấu có giá trị 1. Nếu không, nó là 0. Hãy xem ví dụ về cách biến số 5 thành số âm 5:
Java: bit và byte - 12
Dựa trên hình ảnh này, bạn có thể hiểu các giới hạn trong đó giá trị Byte nằm:
Java: bit và byte - 13
Cũng rõ ràng rằng:
  • nếu chúng ta thêm một vào 127, chúng ta sẽ có -128.
  • nếu chúng ta trừ đi một từ -128, chúng ta sẽ có 127.
Do đó, Byte trong Java có thể nhận giá trị từ -128 đến 127. Như chúng ta đã nhớ, một byte là một octet. Và chữ số tối đa/bit quan trọng nhất có số sê-ri là 7, vì chúng ta đếm từ 0. Trong trường hợp này, thật dễ nhớ rằng một byte bằng -2 lũy thừa 7 (giới hạn dưới) đến 2 lũy thừa 7 trừ 1 (giới hạn trên). Làm việc với chính kiểu dữ liệu đó rất đơn giản. Chúng tôi sử dụng trình biên dịch Java trực tuyến “repl.it” làm “hộp cát” cho bài viết này. https://repl.it/lacular/java. Ví dụ: hãy chạy mã sẽ biểu thị một biến byte ở dạng nhị phân dưới dạng chuỗi:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
Làm việc với byte được sử dụng tích cực khi làm việc với Luồng I/O. Bạn có thể đọc thêm trong hướng dẫn của Oracle: " I/O Streams ". Ngoài ra, trong Java bạn có thể sử dụng một hằng số đặc biệt để chỉ định giá trị dưới dạng bit:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: bit và byte - 14

Thao tác bit

Nhắc đến byte và bit, không thể không nhắc đến nhiều thao tác bit khác nhau. Có lẽ thao tác phổ biến nhất là dịch chuyển (dịch chuyển bit hoặc dịch chuyển bit). Và tất cả là do kết quả của họ mang lại lợi ích thiết thực rõ ràng. Công dụng là gì? Dịch chuyển sang trái N vị trí tương đương với việc nhân số đó với 2N. Và sự dịch chuyển sang phải cũng tương tự như phép chia tương tự.Do đó, 5<<2 == 5*Math.pow(2,2) Và để hiểu tại sao lại như vậy, chúng ta hãy xem ví dụ này chi tiết hơn:
Java: bit và byte - 15
Phủ định bitwise NOT (Unary bitwise), được biểu thị bằng dấu ngã, đảo ngược các bit. Nó được viết dưới dạng dấu ngã, ví dụ ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Điều này một lần nữa cho thấy khi Java thay đổi dấu của một số, ngoài việc đảo ngược các giá trị bit ở cuối, chúng ta còn thực hiện +1. Và nếu không có điều này, như chúng ta thấy, số 5 của chúng ta sẽ thay đổi. Và để nó giữ nguyên số như trước khi đổi dấu, bạn cần thực hiện +1. Bitwise AND cho phép bạn để lại hai số khác nhau có giá trị 1 chỉ trong một bit nếu tất cả các bit có giá trị là một. Điều thú vị về điều này có thể là nó có một số lợi ích ứng dụng:
int x=4;
System.out.println((x&1) != 1);
Mã này kiểm tra số x xem có chẵn lẻ không. Hãy xem một ví dụ:
Java: bit và byte - 16
Bằng cách sử dụng Bitwise AND và Bitwise OR cùng nhau, bạn có thể sử dụng mặt nạ:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Xem " Tùy chọn mặt nạ với toán tử bitwise trong Java " để biết thêm chi tiết . Thao tác bit là một chủ đề thú vị trong đó các bài đánh giá, bài báo và sách riêng biệt đã được viết. Và từ đây bắt đầu con đường dài đến với mật mã. Là một phần của đánh giá này, cần phải hiểu lý do tại sao nó hoạt động và như thế nào. Để biết thêm thông tin về hoạt động bit, tôi khuyên bạn nên đọc bài đánh giá từ tproger: “Giới thiệu về hoạt động bit .”

Các loại nguyên thủy

Vì vậy, một byte là một octet, nghĩa là 8 bit. Thật dễ dàng để nhớ rằng trong Java cũng có 8 kiểu nguyên thủy, thật trùng hợp. Kiểu nguyên thủy là kiểu dữ liệu được tích hợp vào ngôn ngữ lập trình, nghĩa là có sẵn theo mặc định. byte là kiểu dữ liệu nguyên thủy nhỏ nhất xét về dung lượng bộ nhớ mà Java có thể làm việc. Như chúng tôi đã nói trước đó, một byte chiếm 8 bit. Do đó, chữ số có ý nghĩa nhất là số 7. Do đó, byte chứa các giá trị từ -2 đến lũy thừa thứ 7 đến 2 đến lũy thừa thứ 7 trừ đi 1 của kết quả. Có những loại nguyên thủy nào khác:
Java: bit và byte - 17
Như chúng ta có thể thấy từ bảng, các loại dữ liệu xét về lượng dữ liệu chiếm giữ sẽ tăng gấp đôi. Tức là short = 2 * byte và int = 2 * short. Nó thực sự dễ nhớ. Hãy nhớ rằng byte = 8 bit. Thực tế là nó không thể ít hơn cũng được ghi nhớ. Trong tiếng Anh, số nguyên được gọi là số nguyên. Kiểu nguyên thủy từ nó được gọi là int viết tắt. Có một số nguyên thông thường - int. Có loại ngắn, loại ngắn, loại dài, loại dài. Theo đó, int chiếm 32 bit (4 byte). Phiên bản ngắn nhỏ hơn 2 lần - 16 bit (2 byte) và phiên bản dài lớn gấp đôi, tức là. 64 bit (8 byte). Vì vậy, một int tối đa có thể lưu trữ số lượng khoảng 2 tỷ và một trăm triệu. Và long có thể lưu trữ tối đa khoảng 9 triệu triệu (một từ hay). Nhớ lại câu nói đùa xưa về việc một lập trình viên mới vào nghề nghĩ rằng có 1000 byte trong một kilobyte và một lập trình viên hoàn chỉnh tin rằng có 1024 gam trong một kilobyte, chúng ta có thể hiểu:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Nhân tiện, một người đọc chú ý có thể nhận thấy rằng trong hình chỉ có 7 loại. 8 kiểu nguyên thủy là boolean. boolean là kiểu dữ liệu Boolean chỉ có hai giá trị: true và false. Nhưng câu hỏi đặt ra - nó có kích thước bao nhiêu? Đặc tả máy ảo Java và phần " 2.3.4. Loại boolean " sẽ trả lời cho chúng ta:
Java: bit và byte - 18
Nghĩa là, chỉ cần một boolean sẽ có giá trị tương đương với một int. Nếu chúng ta khai báo một mảng boolean thì mỗi phần tử của mảng sẽ chiếm 1 byte. Đây là những điều kỳ diệu như vậy :)

Phần kết luận

Tôi khuyên bạn nên tự làm quen với một số tài liệu khác để củng cố: #Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION