Làm cách nào để chuyển đổi Int thành UInt8 trong Swift? Ví dụ. Tôi muốn chuyển đổi số 22 đến 0b00010110Làm thế nào để chuyển đổi một số thập phân thành nhị phân trong Swift?
var decimal = 22
var binary:UInt8 = ??? //What should I write here?
Làm cách nào để chuyển đổi Int thành UInt8 trong Swift? Ví dụ. Tôi muốn chuyển đổi số 22 đến 0b00010110Làm thế nào để chuyển đổi một số thập phân thành nhị phân trong Swift?
var decimal = 22
var binary:UInt8 = ??? //What should I write here?
Bạn có thể chuyển đổi các giá trị thập phân cho một con người có thể đọc được nhị phân đại diện sử dụng initializer String
mà phải mất một tham số radix
:
let num = 22
let str = String(num, radix: 2)
print(str) // prints "10110"
Nếu bạn muốn, bạn cũng có thể pad nó với bất kỳ số lượng zero khá dễ dàng cũng như:
func pad(string : String, toSize: Int) -> String {
var padded = string
for _ in 0..<(toSize - string.characters.count) {
padded = "0" + padded
}
return padded
}
let num = 22
let str = String(num, radix: 2)
print(str) // 10110
pad(string: str, toSize: 8) // 00010110
Tôi cần một số trong UInt8. Tôi muốn làm việc với byte. Ví dụ để tạo XOR: – subdan
Bạn có thể chỉ cần sử dụng trình khởi tạo 'UInt8()', và truyền vào kiểu 'Int', nếu bạn muốn chuyển đổi một' Int' thành 'UInt8'. Hoặc nếu bạn muốn gán trực tiếp biến 'UInt8', biết giá trị trước thời hạn, sử dụng' let myBits = 0b00010110'. –
Cảm ơn! Nó đã giúp đỡ tôi. Làm thế nào tôi có thể println (UInt8)? Tôi muốn xem các byte thay vì giá trị thập phân. – subdan
Nếu bạn muốn binary
có giá trị của 22
, chỉ cần gán nó rằng: binary = 22
hoặc bạn có thể viết nó như binary = 0b00010110
; hai câu lệnh tương đương nhau.
tôi sửa đổi phiên bản của bạn để Swift 2.0 đếm trên dây và thêm một tấm séc dài:
extension String {
func pad(length: Int) -> String {
let diff = length - self.characters.count
if diff > 0 {
var padded = self
for _ in 0..<diff {
padded = "0" + padded
}
return padded
} else {
return self
}
}
}
Tôi đồng ý với những người khác, Mặc dù vòng lặp for dường như không cần thiết để lặp lại một ký tự.
chúng tôi chỉ đơn giản là có thể đi với những điều sau chuỗi initialiser:
init(count count: Int, repeatedValue c: Character)
sử dụng ví dụ:
let string = String(count: 5, repeatedValue: char)
Đây là một ví dụ đầy đủ:
let someBits: UInt8 = 0b00001110
let str = String(someBits, radix:2) //binary base
let padd = String(count: (8 - str.characters.count), repeatedValue: Character("0")) //repeat a character
print(padd + str)
Đây là cách tôi sẽ làm điều đó:
extension String {
public func pad(with padding: Character, toLength length: Int) -> String {
let paddingWidth = length - self.characters.count
guard 0 < paddingWidth else { return self }
return String(repeating: padding, count: paddingWidth) + self
}
}
String(0b1010, radix: 2).pad(with: "0", toLength: 8) //00001010
hm có vẻ như không có sẵn –
Tính năng nào không khả dụng? – Alexander
tôi sửa đổi phiên bản của một ai đó để nhanh chóng 3.0 sử dụng initializer đúng để tạo một chuỗi với các giá trị lặp đi lặp lại
extension String {
func pad(with character: String, toLength length: Int) -> String {
let padCount = length - self.characters.count
guard padCount > 0 else { return self }
return String(repeating: character, count: padCount) + self
}
}
String(37, radix: 2).pad(with: "0", toLength: 8) // "00100101"
Không có sự khác biệt giữa các hệ thống số nhị phân và thập phân, khi bạn đang làm việc với các biến cho đến khi bạn muốn hình dung chúng hoặc nếu bạn muốn chuyển đổi các loại có thể chứa số lượng bit khác nhau.
Trong trường hợp của bạn là đủ để viết
var decimal = 22
var binary = UInt8(decimal)
Nhưng điều này sẽ sụp đổ (tràn xảy ra) nếu decimal
sẽ tổ chức một giá trị hơn 255, vì nó là giá trị lớn nhất mà UInt8
có thể giữ.
Tùy thuộc vào những gì bạn muốn đạt được bạn có thể viết
var decimal = 261 // 0b100000101
var binary = UInt8(truncatingBitPattern: decimal) // 0b00000101
Bạn sẽ nhận được 0
kết quả là, vì khởi tạo này sẽ truncate bit ít quan trọng.
tùy chọn thứ hai là
var decimal = 256 // 0b100000000
var binary = UInt8(exactly: decimal) // nil
initializer này trả nil
kết quả thay vì đâm, nếu tràn xảy ra.
P.S. Nếu bạn muốn xem biểu diễn chuỗi nhị phân, hãy sử dụng
String(decimal, radix: 2)
String(binary, radix: 2)
UInt8 (thập phân) và UInt8 (chính xác: không tạo ra các biểu diễn nhị phân. TruncatingBitPattern không có sẵn. – ScottyBlades
Vì vậy, tôi có điều này xuất hiện gần đây. Các giải pháp chung khác không phù hợp với tôi, do nhiều vấn đề khác nhau. Dù sao, đây là giải pháp của tôi (Swift 4):
extension String {
init<B: FixedWidthInteger>(fullBinary value: B) {
self = value.words.reduce(into: "") {
$0.append(contentsOf: repeatElement("0", count: $1.leadingZeroBitCount))
$0.append(String($1, radix: 2))
}
}
}
Các xét nghiệm:
// result: 0000000000000000000000000000000000000000000000000000000000001001
String(fullBinary: 9)
// result: 1111111111111111111111111111111111111111111111111111111100000000
String(fullBinary: -256)
// result: 1111111111111111111111111111111111111111111111111101100011110001
String(fullBinary: -9999)
// result: 0000000000000000000000000000000000000000000000000010011100001111
String(fullBinary: 9999)
// result: 1100011000000000000000000000000000000000000011110110100110110101
String(fullBinary: 14267403619510741429 as UInt)
số không có cơ sở cho đến khi bạn muốn hiển thị chúng. – Kevin
'var decimal = 22;' có nghĩa là số nhị phân '1 * (2^4) + 1 * (2^2) + 1 * 2'; –
Câu hỏi của bạn (dựa trên nhận xét) thực sự là: "làm cách nào để XOR byte nhanh chóng?" –