2010-09-10 24 views
6

Tôi có một mảng System.Collections.BitArray (~ 3000 mục) và tôi muốn chuyển tất cả các bit sang bên trái bằng 1. Tuy nhiên, bộ sưu tập dường như không hỗ trợ thao tác đó (ví dụ: bitArray < < 1 không hoạt động và không có phương pháp). Bất kỳ ý tưởng về cách làm điều đó?BitArray - Shift bit

Cảm ơn!

Trả lời

4

Đoạn mã đơn giản này hiển thị cách thủ công để thực hiện. Giá trị của bitArray[0] bị ghi đè:

//... bitArray is the BitArray instance 

for (int i = 1; i < bitArray.Count; i++) 
{ 
    bitArray[i - 1] = bitArray[i]; 
} 

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in 

Làm cho phương pháp này không phải là vấn đề lớn.

+2

Điều đó thật tuyệt ... nhưng chậm. Tôi mặc dù sẽ có một nhà điều hành hoặc phương pháp đặc biệt kể từ khi chúng tôi đang chơi với bit. – Martin

+0

Bạn có thể thực hiện cách sao chép nội dung từ 'BitArray' thành' bool [] 'và sao chép dữ liệu sang một' bool [] 'khác bằng cách sử dụng bù trừ. Cuối cùng, bạn có thể tạo lại 'BitArray' của bạn từ kết quả' bool [] '. Nhưng tôi nghi ngờ nó sẽ nhanh hơn truy cập mỗi phần tử cho ~ 3000 bit của bạn. –

0

Cách dễ nhất mà tôi muốn thoát khỏi đỉnh đầu của tôi là chuyển đổi BitArray thành cấu trúc BigInt hoặc tương tự hỗ trợ dịch chuyển bit và ngược lại. Bây giờ, BigInteger tích hợp trong .Net 4 không hỗ trợ chuyển dịch mà tôi nghĩ, nhưng có những thứ khác làm, giống như việc thực hiện của Mono.

2

System.Numerics.BigInteger thực sự hỗ trợ dịch chuyển bit.

+1

Với một báo trước: "Không giống như thao tác dịch chuyển trái bitwise với số nguyên nguyên, phương thức LeftShift giữ nguyên dấu của giá trị BigInteger ban đầu." Vì vậy (-3 << 30)! = ((BigInteger) (- 3) << 30) – FarmerBob

+0

Và lý do cho điều này là loại BigInteger được ký. – detay

1

Tôi không chắc chắn làm thế nào về hiệu quả nhưng phương pháp mở rộng này không được công việc

public static BitArray ShiftRight(this BitArray instance) 
{ 
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray()); 
} 
+1

OP yêu cầu dịch chuyển sang trái. Tôi thích điều này, vì vậy đây là một phiên bản bên trái thay đổi: trả về BitArray mới ( (instance.Cast () .Take (instance.Length - 1) .ToArray()) .Cấu trúc (new bool [] {newState}) .ToArray() ); – xgo

+0

Thật vậy. Cảm ơn :) – eye

0

tái bitarray mình là một wrapper quanh ulong[]; thực hiện bithifts của một số nhỏ hơn 64 là một miếng bánh theo cách đó và nó sẽ mất ít thời gian hơn và giết ít gấu Bắc cực hơn so với các phương pháp được đề xuất khác. Bằng cách cảnh giác với "các bit sẽ rơi vào cuối", nếu bạn muốn giữ chúng, bạn có thể phải phát triển mảng (hoặc không, nếu chúng bằng 0 và bạn nói rằng phần tử không tồn tại ngầm giữ không).

Các vấn đề liên quan