01/10/2018, 09:52

Làm thế nào để lưu nhiều option vào 1 số

Chào mọi người, mình muốn lưu option của người chọn với trường hợp checkbox, 1 câu có thể lên tới 8 option a,b,c,d,e,… tương ứng 1,2,3,4,5,6,7,8 Làm sao để lưu các số đó xuống thành 1 số và sau đó từ kết quả mình biết được những option đã lưu ạ. Theo yêu cầu mình ko dc lưu thành dạng chuỗi.

HK boy viết 12:03 ngày 01/10/2018

Bạn có thể lưu thành số nguyên 8-bit, 1 là có option và 0 là không có option (do checkbox chỉ có 2 trạng thái: chọn và không chọn).
Lúc cần lấy ra kết quả của bit nào thì dùng phép xor and, còn bật 1 option nào đó thì dùng xor.
Ví dụ:

1 0 0 1 1 1 0 0
h g f e d c b a

Trong ví dụ này, bit phải nhất (bé nhất) thể hiện option a, bit bên trái của bit a là bit b,…

mmmm viết 11:53 ngày 01/10/2018

Bạn ơi, cho mình hỏi

  • mình không xor gì đó như bạn nói mà tại lúc convert từ int ra binary nó là chuỗi nên lấy từng thành phần trong chuỗi đó đc ko
  • mình để ngược lại theo chiều của bạn là abcd… theo chiều từ trái phải dc ko.
Nguyễn Duy Hùng viết 12:01 ngày 01/10/2018

Nếu nó là String thì cứ dùng phương thức .charAt(index) mà truy cập vào ký tự của nó, nhưng muốn sửa đổi thuận tiện thì nên dùng StringBuilder.
Còn muốn nó có ký tự ngược lại thì dùng reversed.

String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
HK boy viết 11:54 ngày 01/10/2018
  • xor là solution nhanh nhất trong bài toán này. Độ phức tạp của nó chỉ là O(1).
  • Ý niệm về bit cũng giống như cái bóng đèn: 1 là đèn bật, 0 là đèn tắt. Trong bài toán này, 1 là có chọn option, 0 là không chọn option.
  • Bạn có thể tìm hiểu các phép thao tác với bit tại đây. Link này là Bitmasks for newbie (về các thao tác xử lí trên bit: and, or, xor,…).
  • Đối với bài này thì: lúc có option a thì bật bit a (bật bit = 1), lúc có option b thì bật bit b,… quan trọng là lúc khởi tạo tất cả các bit đều tắt (tắt bit = 0)
  • Convert từ int -> binary không hẳn là một ý tưởng tốt cho bài toán này. Lúc bật một option nào bất kì thì cơ số hệ 10 sẽ không đảm bảo tính rõ ràng khi thực hiện.
  • Theo yêu cầu bạn không được lưu thành dạng chuỗi, do vậy mình muốn có 1 giải pháp không liên quan đến chuỗi. Thực ra cái flag (số lưu tất cả các trạng thái option) này có kiểu int, thao tác bật/tắt/kiểm tra bit này không cần phải chuyển sang hệ nhị phân mới làm được. Phép and, or, xor sẽ làm việc đó.
  • Bạn có thể đảo ngược thứ tự (a đầu tiên) cũng được. Thứ tự ngược xuôi không quan trọng, quan trọng là bạn nhớ bit a là bit nào.
mmmm viết 11:55 ngày 01/10/2018

Dạ xin lỗi nếu làm bạn bực, nhưng mình nghĩ không ra vì sao xor lại ra được kết quả ( có biết xor). Mình cũng phải cắt chuỗi lấy ra từng thành phần mới biết được option nào được chọn trong 8 bit đó. Mong bạn chỉ ạ.

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

XOR là để toggle thôi còn muốn lấy ra thì phải dùng AND với mặt nạ 0…010…0.

Quân viết 12:00 ngày 01/10/2018

phép toán trên bit thì cần gì cắt chuỗi
ví dụ với đáp án user chọn như sau

00010010 // ứng với chọn câu số 1 và 4, đếm từ trái sang, bắt đầu từ 0 

để kiểm tra 1 câu bất kì đã được chọn hay không thì viết 1 method helper cho nhanh.
VD như:

boolean isChecked(byte options, int questionIndex) {
    if (questionIndex < 0 || questionIndex > 7) {
        throw new IllegalArgumentException("Question index must be from 0 to 7");
    }
    int checkMark = 1 << questionIndex; // -> 00000001 nếu questionIndex = 0, 00000010 nếu questionIndex = 1
    return (options & checkMark) != 0; // kiểm tra bit on tại vị trí cụ thể quy định bởi checkmark, 
    // ví dụ với options = 00010010 và questionIndex = 0 
    //-> checkMark = 00000001 
    //-> options & checkMark = 00000000 -> option tại vị trí 0 chưa được chọn.
    // ví dụ với options = 00010010 và questionIndex = 1
    //-> checkMark = 00000010
    //-> options & checkMark = 00000010 == 2 != 0 -> option tại vị trí 1 được chọn.
}

bạn thấy đó, đây là phép tính trực tiếp trên bit chứ không phải cắt chuỗi.

HK boy viết 11:54 ngày 01/10/2018

Sorry, lâu không học mình quên béng mất =))

Bài liên quan
0