Это странный запрос, но это можно сделать.Этот код принимает два параметра: сначала исходный байт в виде целого числа, а затем второй бит, который вы хотите добавить влево после сдвига в виде 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