2010-09-28 26 views
9

Tôi cần phải chuyển đổi byte theo định dạng bổ sung của hai thành số byte nguyên dương. Phạm vi -128 đến 127 ánh xạ tới từ 0 đến 255.Chuyển đổi bổ sung của Hai

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 

EDIT Để làm sáng tỏ sự nhầm lẫn, byte đầu vào là (tất nhiên) một số nguyên unsigned trong khoảng từ 0 đến 255. NHƯNG nó đại diện một số nguyên đã ký trong phạm vi -128 đến 127 bằng cách sử dụng định dạng bổ sung của hai. Ví dụ, giá trị byte đầu vào là 128 (nhị phân 10000000) thực sự đại diện cho -128.

CHỈNH SỬA EXTRA Được rồi, giả sử chúng tôi có luồng byte sau 0,255,254,1,127. Trong định dạng bổ sung của hai, điều này đại diện cho 0, -1, -2, 1, 127. Điều này tôi cần kẹp đến khoảng 0 đến 255. Để biết thêm thông kiểm tra khó có thể tìm thấy bài viết này: Two's complement

+2

'byte' không được ký kết, anh đang cố gắng để làm gì? – leppie

+0

Tôi vẫn chưa hoàn toàn chắc chắn những gì đã được thử ở đây. Hoặc đó là cách tất cả các câu trả lời cung cấp cho bạn, hoặc bạn hiểu sự đại diện bổ sung của 2 không chính xác. – leppie

Trả lời

7

Từ bạn mẫu đầu vào bạn chỉ đơn giản muốn:

sbyte something = -128; 

byte foo = (byte)(something + 128); 
+0

Vui lòng xem các chỉnh sửa của tôi. Hy vọng nó rõ ràng hơn bây giờ. – Yehonatan

+3

@Yehonatan: Nhưng làm cách nào bạn muốn thể hiện -1 trong phạm vi từ 0 đến 255? – leppie

0

Bạn có thể mô tả một cái gì đó đơn giản như thêm một sự thiên vị để số điện thoại (trong trường hợp này, thêm 128 vào số đã ký).

+0

Nếu chỉ đơn giản thôi. – Yehonatan

6
new = old + 128; 

bingo :-)

+9

vì tôi không thể tìm thấy từ khóa 'bingo', tôi đã chỉnh sửa câu trả lời của bạn để dễ đọc :-) – paxdiablo

+0

'Cũ' giá trị byte gốc hay chuyển đổi của nó? Nếu giá trị byte ban đầu của nó thì điều này sẽ trả lời sai. Nếu sau đó của nó thì đó là quá trình là những gì tôi yêu cầu. – Yehonatan

0

Nếu tôi undestood một cách chính xác, vấn đề của bạn là làm thế nào để chuyển đổi đầu vào, mà thực sự là một signed-byte (sbyte), nhưng đầu vào được lưu trữ trong một unsigned integer, và sau đó cũng tránh các giá trị âm bằng cách chuyển đổi chúng thành 0.

Để rõ ràng, khi bạn sử dụng loại đã ký (như ubyte) khung đang sử dụng Two's complement đằng sau hiện trường, vì vậy chỉ bằng cách truyền sang đúng loại, bạn sẽ sử dụng phần bổ sung của hai.

Sau đó, khi bạn đã thực hiện chuyển đổi đó, bạn có thể kẹp các giá trị âm bằng một đơn giản if hoặc toán tử bậc ba có điều kiện (?:).

Các chức năng được trình bày bên dưới sẽ trả về 0 cho các giá trị from 128 to 255 (hoặc từ -128 đến -1) và the same value cho các giá trị from 0 to 127.

Vì vậy, nếu bạn phải sử dụng số nguyên unsigned như là đầu vào và đầu ra bạn có thể sử dụng một cái gì đó như thế này:

private static uint ConvertSByteToByte(uint input) 
{ 
    sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1 
    if (properDataType < 0) { return 0; } //when negative just return 0 
    if (input > 255) { return 0; } //just in case as uint can be greater than 255 
    return input; 
} 

Hoặc, IMHO, bạn có thể thay đổi đầu vào và đầu ra của bạn để các kiểu dữ liệu phù hợp nhất với đầu vào và đầu ra của bạn (SByte và byte):

private static byte ConvertSByteToByte(sbyte input) 
{ 
    return input < 0 ? (byte)0 : (byte)input; 
} 
2

Hãy thử

sbyte signed = (sbyte)input; 

hoặc

int signed = input | 0xFFFFFF00; 
1
public static byte MakeHexSigned(byte value) 
    { 
     if (value > 255/2) 
     { 
      value = -1 * (255 + 1) + value; 
     } 

     return value; 
    } 
1
int8_t indata; /* -128,-127,...-1,0,1,...127 */ 
uint8_t byte = indata^0x80; 

xor MSB, đó là tất cả

+2

Điều đó không giống như C# với tôi – reggaeguitar

0

Tôi tin rằng 2s bổ sung cho byte sẽ được thực hiện tốt nhất với những điều sau đây. Có lẽ không thanh lịch hay ngắn nhưng rõ ràng và rõ ràng. Tôi sẽ đặt nó như là một phương pháp tĩnh trong một trong các lớp util của tôi.

public static sbyte ConvertTo2Complement(byte b) 
{ 
    if(b < 128) 
    { 
     return Convert.ToSByte(b); 
    } 
    else 
    { 
     int x = Convert.ToInt32(b); 
     return Convert.ToSByte(x - 256); 
    } 
} 
1

Đây là giải pháp cho vấn đề này, đối với số lớn hơn 8 bit. Ví dụ của tôi là cho một giá trị 16-bit. Lưu ý: Bạn sẽ phải kiểm tra bit đầu tiên, để xem nếu nó là một tiêu cực hay không.

bước:

  1. Chuyển đổi # để khen bằng cách đặt '~' trước khi biến. (Ví dụ. Y = ~ y)

  2. Chuyển đổi # s đến chuỗi nhị phân

  3. Nghỉ chuỗi nhị phân vào mảng nhân vật

  4. Bắt đầu với giá trị nhất phải, thêm 1, theo dõi thực. Lưu trữ kết quả trong mảng ký tự.

  5. Chuyển đổi mảng ký tự thành chuỗi.

    private string TwosComplimentMath(string value1, string value2) 
    { 
        char[] binary1 = value1.ToCharArray(); 
        char[] binary2 = value2.ToCharArray(); 
        bool carry = false; 
        char[] calcResult = new char[16]; 
    
        for (int i = 15; i >= 0; i--) 
        { 
         if (binary1[i] == binary2[i]) 
         { 
          if (binary1[i] == '1') 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = true; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = true; 
           } 
          } 
          else 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = false; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = false; 
           } 
          } 
         } 
         else 
         { 
          if (carry) 
          { 
           calcResult[i] = '0'; 
           carry = true; 
          } 
          else 
          { 
           calcResult[i] = '1'; 
           carry = false; 
          } 
         } 
    
        } 
    
        string result = new string(calcResult); 
        return result; 
    
    } 
    
Các vấn đề liên quan