добавить новый бит слева от байта и отбросить правый бит байта - PullRequest
0 голосов
/ 31 марта 2011

каждый!если есть новый бит для вставки одного байта, как я могу решить с ним?например:

, если в байт добавляется новый бит 1 (ex.0xaa) 10101010 ==> 11010101

, если приходит новый бит 0 t0 в байте (ex.0xaa)10101010 ==> 01010101

есть предложения?

Ответы [ 3 ]

1 голос
/ 03 апреля 2013

Это странный запрос, но это можно сделать.Этот код принимает два параметра: сначала исходный байт в виде целого числа, а затем второй бит, который вы хотите добавить влево после сдвига в виде 0 или 1. Сдвиг вправо легко с целыми числами;просто разделите на 2, и остаток будет сброшен.Давайте возьмем 2 в степень 7 и сохраним их в переменной @FlagNumber для использования в наших вычислениях.

Если мы хотим установить бит слева на ноль, нам нужно сначала проверить значение.Бит в восьмом месте уже должен быть нулем, но давайте проверим, на случай, если кто-то передал значение больше 255, давайте проверим.Если по какой-то причине он установлен в 1, мы будем использовать простой ^ (xor) для его выключения.

Если мы хотим установить бит слева в единицу, мы будем использовать простой |(или) включить)

Я оберну все это в функцию, и вот что вы получите.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Jacob Raines
-- Create date: 2013-04-03
-- Description: Shift byte to the right and set 8th bit
-- =============================================
CREATE FUNCTION dbo.Flag_ByteAppendLeft
(
    @InputByte int,     --10101010
    @InputBit int       --0 or 1
)
RETURNS int
AS
BEGIN
    /* Examples & Notes 
        SELECT dbo.Flag_ByteAppendLeft(170, 1)  --(10101010, 1) Should Return 11010101 (213)
        SELECT dbo.Flag_ByteAppendLeft(170, 0)  --(10101010, 0) Should Return 01010101 ( 85)
    */
    DECLARE @OutputByte int
    DECLARE @FlagPower as int
    DECLARE @FlagNumber as int

    SET @OutputByte = @InputByte / 2 --Bit Shift once to the right
    SET @FlagNumber = 7 --Flag 7 (starting at 0) is the 8th bit.
    SET @FlagPower = POWER(2, @FlagNumber)  

    IF (@InputBit = 0)
    BEGIN
        IF (@OutputByte & @FlagPower = @FlagPower)  -- If set
        BEGIN
            SET @OutputByte = @OutputByte ^ @FlagPower  -- Then Toggle Flag with xor
        END
    END
    ELSE
    BEGIN
        SET @OutputByte = @OutputByte | @FlagPower      -- Set Flag
    END

    RETURN @OutputByte
END
GO
1 голос
/ 31 марта 2011

если есть бит

0x80 | (0xaa>>1) 

если htere не бит

0x7F & (0xaa>>1) 
0 голосов
/ 21 июля 2013

В C вы можете сделать следующее, если это unsigned int.

Добавление бита logic 1 влево.

x = 0x80000000 | (x >> 1);

Добавление бита logic 0 влево.

x = x >> 1;

Отмечая, что в C >> является логическим сдвигом из-за unsigned int и поэтому при сдвиге вправо помещает бит logic 0 влево.

Также обратите внимание, что 0x8000000 будет работать только из-за дополнительного бита в unsigned int.

...