Saya sedang membaca halaman ini, di mana dikatakan bahwa 41 bit digunakan untuk mewakili 41 tahun menggunakan zaman khusus.

Saya tidak dapat memahami hubungan antara waktu dalam milidetik, bit, dan tahun. Adakah yang bisa membantu?

Misalnya. Di Java, System.currentTimeMillis() mengembalikan long, yaitu 64 bits. Apakah itu berarti itu bisa mewakili nilai unik senilai 64 tahun jika saya harus menghasilkan 1 per milidetik?

Dalam kasus di atas, apa yang terjadi setelah 41 tahun? Apakah mereka harus meningkatkan bit yang digunakan untuk menunjuk jika mereka tetap menggunakan pendekatan yang sama?

0
Ufder 12 Mei 2021, 17:19

4 jawaban

Jawaban Terbaik

Ini kebetulan yang aneh bercampur dengan cara yang aneh untuk menulisnya. 41 bit sebenarnya memberi Anda 69 tahun, bukan 41. Penulis dokumentasi ini mengacaukan atau menyederhanakan, tetapi perhatikan bahwa 69 cukup dekat dengan 41, secara kebetulan.

Mari kita selidiki apa yang kita ketahui sedikit:

Mereka secara eksplisit menyebut bahwa itu adalah semacam nilai 'milidetik'. Kita juga tahu bahwa itu 41 bit, dan sisanya, yah, sisanya harus kita tebak.

Mari kita kerjakan hal-hal yang kita ketahui: 41 bit, dan 'milidetik'.

41 bit seperti 41 sakelar lampu terpisah. Bayangkan permainan berikut:

Anda bisa memasuki sebuah ruangan. Ini memiliki 1 sakelar lampu di dalamnya dan tidak ada yang perlu diperhatikan. Anda tidak dapat meninggalkan apa pun, menggaruk dinding, atau berinteraksi dengan ruangan ini, kecuali sakelar lampu. Kemudian, Anda harus pergi. Kemudian saya masuk beberapa waktu kemudian.

Berapa banyak informasi yang dapat kita komunikasikan?

Dengan satu sakelar lampu, hanya 1 bit informasi: Anda dapat membiarkan lampu menyala, atau mati, dan hanya itu yang saya tahu. Jika semua yang Anda butuhkan untuk berkomunikasi dengan saya adalah hasil dari coinflip yang Anda amati dan saya tidak, maka hanya 1 bit yang kami butuhkan. Kami membuat pengaturan terlebih dahulu: Lampu ke bawah berarti koin mendarat ekor, sakelar lampu ke atas berarti kepala mendarat. Voila, sekarang kita bisa berkomunikasi 1 koin flip.

Katakanlah ada 2 sakelar lampu sebagai gantinya. Anda sekarang dapat berkomunikasi 4 hal yang berbeda. Katakanlah seseorang mengambil kartu dari setumpuk dan Anda melihat itu dan saya tidak: Anda dapat mengomunikasikan setelan itu kepada saya, jika kita mengatur 'kode'.

Memperlakukan 'mematikan lampu' sebagai 0 dan 'menyalakan lampu' sebagai 1, maka kita dapat mengatur kode ini sebelumnya:

00 - hearts
01 - clubs
10 - spades
11 - diamonds

Jadi, jika saya memasuki ruangan, saya melihat sakelar lampu kiri turun dan sakelar kanan bawah menyala, saya dapat mengatakan: Anda menggambar tongkat! Dan itu benar.

Setiap sakelar lampu yang Anda tambahkan menggandakan jumlah status yang dapat Anda komunikasikan. jadi, 1 sakelar lampu bagus untuk membedakan 2 hal (coinflip misalnya), 2 sakelar dapat melakukan 4 hal, 3 sakelar dapat melakukan 8, 4 sakelar dapat melakukan 16, dan seterusnya.

Di sini kami memiliki 41 sakelar lampu. Itu bagus untuk membedakan antara 2^41, atau 2,199,023,255,552 nilai unik yang berbeda. Dengan cara matematika sederhana.

Kita juga tahu bahwa ini membedakan antara 'milidetik'. Mari kita baca sebagai: Mekanisme ini mampu menyimpan waktu dengan granularitas 1 milidetik. Dengan kata lain, ia dapat membedakan 2 titik waktu mana pun selama 2 titik waktu tersebut setidaknya berbeda 1 milidetik.

Mari kita bekerja pada milidetik sedikit:

  • Bagi dengan 1000 untuk detik.
  • Bagi dengan 60 selama beberapa menit.
  • Bagi dengan 60 selama berjam-jam.
  • Bagi dengan 24 untuk hari.
  • Bagi dengan 365,25 selama bertahun-tahun.

Jadi mari kita lakukan saja. 2.199.023.255.552/1000/60/60/24/365,25 = 69.682842027.

Dengan kata lain, dengan 41 sakelar lampu, Anda dapat berkomunikasi saat ini dengan saya dengan perincian milidetik, selama kita mengatur sebelumnya bahwa kita tahu bahwa kita berkomunikasi hanya tentang rentang waktu tertentu, dan rentang itu dapat tidak lebih besar dari sedikit lebih dari 69 setengah tahun.

Cara termudah untuk membuat pengaturan seperti itu adalah dengan menetapkan titik waktu tertentu sebagai 'zaman' - nilai 0.

Misalnya, kita dapat membuat pra-pengaturan ini:

  • Mari kita putuskan bahwa zona waktu UTC, tahun baru seperti tahun 1999 menjadi tahun 2000, yang sangat instan dalam waktu, kita sebut itu 0. Kemudian angka tersebut mewakili beberapa milidetik kemudian.

Jadi, angka 60000 mengkodekan waktu instan di mana (pada zona waktu UTC), waktunya adalah 2000-01-01 00:01:00 (1 menit setelah tengah malam pada tahun 2000 di zona UTC).

Dengan kata lain, saya memasuki ruangan dan saya perhatikan bahwa semua sakelar lampu mati kecuali yang ke-2 dan ke-3 dari kanan: 0000...00110. Kami mengatur sebelumnya bahwa itu adalah mekanisme penghitungan biner yang biasa, jadi itu 6. Jadi, saya tahu bahwa Anda mencoba memberi tahu saya bahwa gambar itu diambil 6 detik setelah tengah malam, tahun 2000, zona UTC.

41 bit kami membawa kami ke 2069-07-01 atau lebih (Juli 2069) dan kemudian kami kehabisan bit. Jika Anda membabi buta terus menghitung, yah, komputer berputar-putar, maka Anda mendapatkan angka 0 lagi, dan kami akan salah membacanya sebagai: Juuust di tengah malam, tahun 2000.

Dengan kata lain, Ini adalah 69 dan sedikit tahun, dan 41 hanyalah kotoran kuda lengkap. Saya tidak tahu mengapa mereka menulis 41. Tapi, 41 setidaknya mendekati 69, jadi mungkin itu penyederhanaan yang berlebihan.

Apa yang terjadi ketika mereka mencapai 2041, atau memperbaiki kesalahan dalam dokumentasi mereka sendiri, 2069? Nah, satu solusi mudah untuk mis. membeli 10 tahun lagi adalah menetapkan bahwa 0 dibaca sebagai Agustus 2069, dan bukan tahun 2000, tidak apa-apa karena instagram belum ada. Tapi itu hanya memberi Anda beberapa tahun lagi.

Kemudian, postingan instagram yang benar-benar lama tiba-tiba terlihat seperti berasal dari tahun 2080 (dengan mendefinisikan ulang jendela 69-bit ke atas, stempel waktu apa pun yang tidak ada di jendela terlihat seperti itu, dan dengan demikian benar-benar salah), atau mereka mengubah sistem ID mereka dan mis tambahkan beberapa bit lagi. Setiap bit mereka menambahkan menggandakan ukuran jendela. bahkan 1 bit sudah cukup untuk 69 tahun lagi.

1
rzwitserloot 12 Mei 2021, 14:49

Epoch standar untuk waktu adalah 1 Januari 1970.

long v = LocalDate.now().getLong(ChronoField.EPOCH_DAY);
long millis = v*24*3600*1_000L; // total possible milliseconds
System.out.println(Long.toBinaryString(millis).length()); // length = 41

Jadi dibutuhkan 41 bit yang lama untuk mewakili jumlah milidetik sejak Epoch. Itu menyisakan 23 bit tersisa yang akan menjadi beberapa tahun lagi (pernyataan kotor).

1
WJS 12 Mei 2021, 14:39

Tidak. 41 tahun dari 41 bit tidak berarti 64 bit akan menghasilkan 64 tahun. Pada awalnya: Itu tidak benar. 2^41/1000/60/60/24/365.24 mengevaluasi hampir 70 tahun, bukan 41. Kedua: Jika 41 bit adalah 41 tahun maka 42 bit akan menjadi 82 tahun dan 43 bit akan menjadi 164 tahun. mengerti? Setiap bit baru menggandakan hasilnya. Oleh karena itu 64 bit sudah cukup untuk jutaan tahun.

1
Dietmar Höhmann 12 Mei 2021, 14:34

Misalnya. Di Java, System.timeinmillis() mengembalikan panjang, yaitu 64 bit. Apakah itu berarti itu bisa mewakili nilai unik senilai 64 tahun jika saya harus menghasilkan 1 per milidetik?

Tidak, jauh lebih dari itu. Jangan lupa bahwa untuk setiap bit yang Anda tambahkan di penyimpanan, Anda dapat menyimpan nilai dua kali lebih banyak.

2^64 adalah 18.446.744.073.709.551.616. Itulah berapa banyak nilai berbeda yang dapat disimpan dalam tipe data integer 64-bit.

Jadi pada presisi milidetik, yaitu:

  • 18.446.744.073.709.551.616 milidetik
  • 18.446.744.073.709.551 detik
  • 307.445.734.561.825 menit
  • 5.124.095.576.030 jam
  • 213.503.982.334 hari
  • 584.542.046 tahun

Juga dikenal sebagai "mungkin lebih banyak jangkauan daripada yang Anda butuhkan" :)

5
Jon Skeet 12 Mei 2021, 15:39